小白写的题解,可能不是最优解,但是很好理解: 因为两人都使用最佳策略,所以两人依次取数的时候取的都是所剩的最大值,所以我们把每个样例的数据排序好,然后依次求和,得到小紫不使用技能的情况下的两人的总和;然后我们考虑这个技能,这个技能也很好理解,其实就是用小紫的最小的数去换小红最大的数,这样才是最优情况,由于数组是排序好的,arr[0]肯定是最大而且是小红拿的,arr[n-1]肯定最小而且是小紫拿的,我们把这两个数交换一下就可以了,最后附上ac代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
bool cmp(int a,int b)//用于将数组从大到小排序
{
return a>b;
}
signed main()
{
int t;cin>>t;//t组样例
while(t--)
{
vector<int>arr;//用于存值且排序的数组
int n;cin>>n;
int i,time=1,j,sum=0,num,sum2=0;//sum为小红的总和,sum2为小紫的
for(i=1;i<=n;i++)//输入数据
{
cin>>num;
arr.push_back(num);
}
sort(arr.begin(),arr.begin()+n,cmp);//将数据从大到小排序
for(i=0;i<n;i++)//遍历排序后的数组
{
if(i%2==0)// 小红先拿
sum+=arr[i];
else
sum2+=arr[i];
}
sum=sum-arr[0]+arr[n-1];//把小红的最大值与小紫的最小值交换
sum2=sum2-arr[n-1]+arr[0];//把小红的最大值与小紫的最小值交换
//最后按照题意判断就可以了
if(sum>sum2)
cout<<"kou"<<'\n';
else if(sum<sum2)
cout<<"yukari"<<'\n';
else
cout<<"draw"<<'\n';
//cout<<sum<<" "<<sum2<<'\n';
}
return 0;
}