小白写的题解,可能不是最优解,但是很好理解: 因为两人都使用最佳策略,所以两人依次取数的时候取的都是所剩的最大值,所以我们把每个样例的数据排序好,然后依次求和,得到小紫不使用技能的情况下的两人的总和;然后我们考虑这个技能,这个技能也很好理解,其实就是用小紫的最小的数去换小红最大的数,这样才是最优情况,由于数组是排序好的,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;
}