P11148 [THUWC 2018] 零食

P11148 [THUWC 2018] 零食

思路

可以把妙值分为正的和负的,正的尽量全部拿下,负的就可以交叉放置(舍掉),记得要拿一个最小的作为开头。当薯片和果干的负收益的数量差值大于一时,就要拿另一种正收益更多的零食的正收益去抵消掉负收益。

ACcode

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
#define endl '\n'
#define inf 0x7f7f7f7f7f7f7f7f
const int N=1e5+1;
int T,n,m,a[N],b[N],sa[N],sb[N],ans;

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
//  freopen("P11148_1.in","r",stdin);
//  freopen("114514.out","w",stdout);
//↑以上为初始化 ↑
//------------------------------
	cin >> T;
	while(T--){
		ans=-inf;
		cin >> n;
		for(int i = 1;i<=n;++i) cin >> a[i];
		cin >> m;
		for(int i = 1;i<=m;++i) cin >> b[i];
		sort(a+1,a+n+1);
		sort(b+1,b+m+1);
		sa[n]=0,sb[m]=0;
		for(int i = n;i>=1;--i) sa[i-1]=sa[i]+a[i];
		for(int i = m;i>=1;--i) sb[i-1]=sb[i]+b[i];
		for(int i = 1;i<=min(n,m);++i){
			ans=max(ans,sa[i]+sb[i]);
			if(i+1<=n) ans=max(ans,sa[i+1]+sb[i]);
			if(i+1<=m) ans=max(ans,sa[i]+sb[i+1]);
		} 
		cout << ans << endl;
	}
	return 0;
}
posted @ 2026-10-22 07:27  elon_giao  阅读(3)  评论(0)    收藏  举报