原题链接:https://vjudge.net/problem/UVA-1614
分类:数学结论
备注:思维,证明
下面是抄的知乎DL的证明过程,两个重要的命题。补充:Si是从后往前算的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll a[maxn],sum[maxn];
int tag[maxn],n;
int main(void){
//freopen("in.txt","r",stdin);
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
sum[i]=sum[i-1]+a[i];
}
if(sum[n]&1)printf("No\n");
else{
printf("Yes\n");
memset(tag,0,sizeof(tag));
int s=sum[n]/2;
for(int i=n;i>=1;i--){
if(s>=a[i]){
tag[i]=1;
s-=a[i];
}
}
for(int i=1;i<=n;i++)
printf("%d%c",tag[i]?1:-1,i==n?'\n':' ');
}
}
return 0;
}