这道题的代码来自出题人FriedChicken ,以此为基础进行学习这道题的思路以及代码处理,才用前缀和来计算孩子的幸福

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
typedef double db;
int T,A,B,n;
int va[10010],vb[10010];
bool cmp(int xx,int yy)
{
    return xx>yy;
}
int suma[10010],sumb[10010];
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>A>>B>>n;//n是圆圈的总人数
        rep(i,1,A) scanf("%d",&va[i]);
        rep(i,1,B) scanf("%d",&vb[i]);
        int mxb=min(n/2,B);//n是总的所要的人数,b是闹腾孩子的总数
        //取最小的闹腾的人数为n/2,或者是B闹腾孩子人数本身
        if(mxb+A<n)//只能选闹腾的人数加全部幸福的人数不足所需要的人数的时候,无解
        {
            puts("-1");
            continue;
        }
        sort(va+1,va+1+A,cmp);//+1是因为上面从一开始的,va是从0开始的
        sort(vb+1,vb+1+B,cmp);//按照从大到小排序
        rep(i,1,A) suma[i]=suma[i-1]+va[i];//前缀和,用来计算幸福度
        rep(i,1,B) sumb[i]=sumb[i-1]+vb[i];
        int ans=-1;
        rep(ia,0,A)
        {
            int ib=n-ia;
            if(ib>mxb||ib<0) continue;
            ans=max(ans,suma[ia]+sumb[ib]);
        }
        printf("%d\n",ans);
    }
}