[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; 
}
posted @ 2025-03-26 11:05  WuMin4  阅读(10)  评论(0)    收藏  举报