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;
}

浙公网安备 33010602011771号