牛客寒假训练营 1 J 小朋友做游戏(前缀和,贪心)

由于两个闹腾的小朋友不能放到一块,那么圆圈最多只能选择n/2个闹腾的小朋友(下取整)

由于要求班级的幸福度最大,那么每次都要选择尽可能多的幸福度的小朋友

其实是和这题类似的

1239. 乘积最大(字符串贪心)_qq12323qweeqwe的博客-CSDN博客

但是不同点在于,乘积最大是有负数的,所以这里可以采用其他的方法

限制条件

  • 最多只能选n/2个闹腾的小朋友
  • 安静的小朋友总数<n/2  直接失败

因为幸福度是相加的,而我们要求最大幸福度之和,所以贪心的想,我们把安静的小朋友和闹腾的小朋友数组分别排序之后,然后应用前缀和就可以在O(1)的时间复杂度下得出选中i个小朋友的幸福度之和

而我们枚举一遍选了多少了安静的小朋友就可以得出答案了

#include <iostream>
#include <algorithm>
using namespace std;
const int N=2e4+10;
int a[N];int b[N];

bool cmp(int a,int b)
{return a>b;}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int x,y,n;
        cin>>x>>y>>n;
        for(int i=1;i<=x;i++)
            cin>>a[i];
        for(int i=1;i<=y;i++)
            cin>>b[i];
        //限制条件1.安静的小朋友至少n/2个
        if(x*2<n) {cout<<-1<<'\n';continue;}
        sort(a+1,a+1+x,cmp),sort(b+1,b+1+y,cmp);
        for(int i=1;i<=x;i++)
            a[i]+=a[i-1];
        for(int i=1;i<=y;i++)
            b[i]+=b[i-1];
        int res=-1;
        y=min(n/2,y);     //y最多选n/2个
        for(int i=0;i<=x;i++)
        {
            int j=n-i;
            //由于最多选n/2个,所以在超过n/2会直接跳过
            if(j<0||j>y) continue;
            res=max(res,a[i]+b[j]);
        }
        cout<<res<<'\n';
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值