题意:
输入n个数,第i个数ai满足1≤ai≤i。对每个数添加符号,使和值为0。
分析:
排序后从最大的元素(假设为k)开始,凑出sum/2即可。用去掉了k的集合,一定可以凑出sum/2 - a[k]。只要sum是偶数,就一定会有解。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
int a[maxn];
int r[maxn];
bool cmp(int x,int y)
{
return a[x] < a[y];
}
int main()
{
int n;
int i;
while(~scanf("%d",&n))
{
long long sum=0;
for(i=0;i<n;i++)
{
scanf("%d",a+i);
sum+=a[i];
r[i]=i;
}
if(sum&1)
{
cout<<"No"<<endl;
continue;
}
sort(r,r+n,cmp);
sum>>=1;
for(i=n-1;i>=0;i--)
{
int j=r[i];
if(a[j]<=sum)
{
sum-=a[j];
a[j]=1;
}
else
{
a[j]=-1;
}
}
printf("Yes\n%d",a[0]);
for(i=1;i<n;i++)
printf(" %d",a[i]);
printf("\n");
}
return 0;
}