[ABC396C] Buy Balls
题意
给出 \(n\) 个黑球和 \(m\) 个白球,每个球都有一个权值(可以为负),要求选出一些球或不选球,使得黑球数量不少于白球,且权值最大。
思路
很容易想到将白球与黑球从大到小按照权值排序。因为黑球数量不能少于白球数量,所以每次需要选择一个白球与一个黑球或只选择一个黑球。
因为白球和黑球的权值是从大到小排序的,所以若当前白球权值小于 \(0\) 时,之后的白球权值都将小于 \(0\),并且只选择黑球一定比选择黑球和白球更优。
所以当白球权值小于 \(0\) 时,每次只需选择一个黑球,取该过程的最大权值即可得到答案。
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,b[200005],w[200005],ans;
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr),cout.tie(nullptr);
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>b[i];
for(int i=1;i<=m;i++)
cin>>w[i];
sort(b+1,b+1+n);
sort(w+1,w+1+m);
for(int nw=0,j=n,i=m;j>=1;i--,j--){
if(i>=1&&w[i]>=0)
nw+=b[j]+w[i];
else
nw+=b[j];
ans=max(ans,nw);
}
cout<<ans;
return 0;
}

浙公网安备 33010602011771号