我是靠谱客的博主 彩色导师,最近开发中收集的这篇文章主要介绍牛客寒假训练营 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';
    }
}

最后

以上就是彩色导师为你收集整理的牛客寒假训练营 1 J 小朋友做游戏(前缀和,贪心)的全部内容,希望文章能够帮你解决牛客寒假训练营 1 J 小朋友做游戏(前缀和,贪心)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部