题目描述
助教W和助教Z在一起玩拿石子游戏,地上一共有 n 堆石子,第 i 堆的石子数量为 n i,游戏的规则如下:
两个助教轮流拿走一堆石子,助教W先拿。
助教W必须拿走当前地上的石子堆中,石子数为偶数的、石子数最多的一堆。
助教Z必须拿走当前地上的石子堆中,石子数量最少的一堆。
地上如果没有石子数为偶数的石子堆,则剩余的石子全部归助教Z。
石子全部拿完后,石子数更多的助教获胜。
输入格式
总共有 2 行输入,数字之间用空格分隔。
第一行包含一个整数 n ,代表石子堆的数量。
接下来一行的 n 个数字,每个数字代表第 i 个石子堆中石子的数量 n i 。
输出格式
一个字符,如果助教W获胜,则输出 W ;如果助教Z获胜,则输出 Z ;如果两人石子数量相同,则输出 0 。
样例输入
样例输入 1
3
2 5 6
样例输入 2
4
4 6 5 3
样例输出
样例输出 1
Z
说明:
W拿走6,Z拿走2;
W没有别的石子能拿,最终W有6颗石子,Z有7颗石子
样例输出 2
W
说明:
W拿走6,Z拿走3;
W拿走4,Z拿走5;
最终W有10颗石子,Z有8颗石子
数据范围1≤n≤10^5,1≤n i≤20000
下面是我的代码,没有写完:
#include <iostream>
using namespace std;
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (arr[j] <= pivot) {
i++;
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main()
{
int n;
cin>>n;
int *stone=new int [n]{};
int *even=new int [n];
int i=0,j=0;
int x;
while(cin>>x){
stone[i]=x;
i++;
if(x%2==0){
even[j]=x;
j++;
}
if(i==n) break;
}
//n堆石子,有j堆偶数的
quickSort(stone,0,n-1);
quickSort(even,0,j-1);
int count=n;
int W=0,Z=0;
int k=0;
while(count>0){
W+=even[j-1];
count--;
for(int y=n-1;y>=0;y--){
if(stone[y]==even[j-1]) {stone[y]=0;}
}
even[j-1]=0;
j--;
//
if(count==0) break;
bool flag=true;
for(int i=0;i<j;i++){
if(even!=0) flag=false;
}
if(flag){
for(int i=0;i<n;i++){
Z+=stone[i];
}
}
else{
if(stone[k]==0){
k++;
Z+=stone[k];
count--;
k++;
}
else{
Z+=stone[k];
count--;
k++;
}
}
}
for(int k=0;k<n;k++){
cout<<stone[k]<<" ";
}
cout<<endl;
for(int k=0;k<j;k++){
cout<<even[k]<<" ";
}
cout<<endl;
cout<<W<<"and"<<Z;
return 0;
}