题意:输入一个长度为n的序列a,满足1<=ai<=i,要求确定每个数的正负号,使得所有数的总和为0。
分析:和为奇数肯定是不能,一开始想法是找序列中最大和第2大的数,然后相减,再加入队列,重复此过程,就是Huffman编码。但是其实并不需要这样,求出能加到序列和的一半的序列就好了。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 5;
struct node
{
int x;
int id;
}a[maxn];
int ans[maxn];
bool cmp(node a, node b)
{
return a.x > b.x;
}
int main()
{
int n;
while (cin >> n)
{
long long sum = 0;
for (int i = 0; i < n; i++)
{
cin >> a[i].x;
a[i].id = i;
sum += a[i].x;
}
if (sum % 2)
{
cout << "No" << endl;
continue;
}
sum /= 2;
sort(a, a + n, cmp);
for (int i = 0; i < n; i++)
{
if (a[i].x <= sum)
{
ans[a[i].id] = 1;
sum -= a[i].x;
}
else ans[a[i].id] = -1;
}
if(sum!=0)continue;
cout << "Yes" << endl;
for (int i = 0; i < n-1; i++)
cout << ans[i] << " ";
cout << ans[n - 1] << endl;
}
return 0;
}