题目链接:https://vjudge.net/problem/CodeForces-1201B
题意:一串数,随便选两个数让它们都减1,问能否让它们全部变成0.
思路:一开始是随便选两个数,然后看能否把它们补齐,但是1 1 100这一组过不了,想了想应该是取最小的和最大的看能否补齐。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
long long m[maxn];
int main()
{
int n;
scanf("%d",&n);
long long a=0,b=0;
for(int i=1; i<=n; i++)
{
scanf("%lld",&m[i]);
}
sort(m+1,m+n+1);
a=m[1],b=m[n];
for(int i=2; i<n; i++)
{
long long x=m[i];
if(a==b)
{
if(x%2)
{
a=a+(x/2)+1;
b=b+(x/2);
}
else
{
a=a+(x/2);
b=b+(x/2);
}
}
else if(a>b)
{
if(x<a-b)
{
b+=x;
}
else
{
long long c=a-b;
x-=c;
b+=c;
if(x%2)
{
a=a+(x/2)+1;
b=b+(x/2);
}
else
{
a=a+(x/2);
b=b+(x/2);
}
}
}
else
{
if(x<b-a)
{
a+=x;
}
else
{
long long c=b-a;
x-=c;
a+=c;
if(x%2)
{
a=a+(x/2)+1;
b=b+(x/2);
}
else
{
a=a+(x/2);
b=b+(x/2);
}
}
}
}
if(a==b)
{
printf("YES");
}
else
printf("NO");
return 0;
}