原题链接: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;
}
该博客详细介绍了如何解决UVA在线判题平台上的第1614题,这是一道涉及数学结论和证明的问题。博主通过C++代码展示了如何判断一个整数数组是否可以被分为两个子集,使得两个子集的元素和相等。证明过程中使用了前缀和技巧,并从后往前计算,确保了正确性。
&spm=1001.2101.3001.5002&articleId=112646742&d=1&t=3&u=3cfb7e51cda94670bc8e30cdc68b68bb)
2547

被折叠的 条评论
为什么被折叠?



