概述
由于两个闹腾的小朋友不能放到一块,那么圆圈最多只能选择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 小朋友做游戏(前缀和,贪心)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复