codeforces1467 C. Three Bags

https://codeforces.com/contest/1467/problem/C

还好用没用算分号打这场。。。又是找规律又是计数又是阅读理解题,极不友好

这题本质就是每个数字最后前面是正号还是负号的问题

找规律可以发现要么最后所在的那个集合,他原本的数字都可以全是正号,然后另外两个集合分别选最小的为负号,其他都是正号

然后坑点是我们其实可以让一个集合全是负号,一个集合全是正号,再转移到最后所在的集合

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxl=3e5+10;
const int inf=2e9;

int n[4],m,k,cnt,tot,cas;ll ans;
int a[4][maxl],mi[4],sec[4];
ll sum[4];
bool vis[maxl];
char s[maxl];

inline void f(int &a,int &b,int x)
{
	if(x<a || a==0)
		b=a,a=x;
	else if(b==0 || x<b)
		b=x;
}

inline void prework()
{
	for(int i=1;i<=3;i++)
		scanf("%d",&n[i]);
	for(int i=1;i<=3;i++)
	{
		mi[i]=sec[i]=0;
		for(int j=1;j<=n[i];j++)
		{
			scanf("%d",&a[i][j]),sum[i]+=a[i][j];
			f(mi[i],sec[i],a[i][j]);
		}	
	}
}

inline void mainwork()
{
	ans=1ll<<60;ans=-ans;
	ll s=sum[1]+sum[2]+sum[3];
	for(int i=1;i<=3;i++)
	{
		ll tmp=s;
		for(int j=1;j<=3;j++)
		if(i!=j)
		{
			ans=max(ans,s-2*sum[j]);
			tmp-=2*mi[j];
		}
		ans=max(ans,tmp);
	}
}

inline void print()
{
	printf("%lld\n",ans);
}

int main()
{
	int t=1;
	//scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liufengwei1/article/details/112386505