uva1614
这是个贪心,你或许可以用严格的数学思维做出来,或者就大胆猜想...
贪心的严格的数学思维,我查了查其他人的题解,可以用数学归纳法总结出来,这里我主要用大胆猜想来说一下...
首先要做的就是把所有数求和,然后如果和是奇数的话,我们必然输出No
我们把sum除2,然后就可以随便选了啊,只要a[i]的值小于当前sum值,我们就选了,赋值成1;否则赋值为-1;
我看有的题解要排序,其实不需要,排序无非是从大到小取...我反正觉得意义不大...
但是这题贪心的理论依据是1~sum[i]里的值都可以用a[1],a[2]...a[i]里的数值凑出来...可以用数学归纳法做,否则只能大胆猜想一波
// // Created by luckybird on 2017/11/13. // #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int maxn = 1e5 + 10; int a[maxn]; int ans[maxn]; int main() { int n; while( scanf("%d", &n) == 1 ) { int i; long long sum = 0; for( i = 0; i < n; i++ ) { scanf("%d", &a[i]); sum = sum + a[i]; } if( sum % 2 == 1) { printf("No\n"); continue; } sum = sum / 2; for( i = n-1; i >= 0; i--) { if(sum >= a[i]) { ans[i] = 1; sum = sum - a[i]; } else ans[i] = -1; } printf("Yes\n"); for( i = 0; i < n; i++) printf("%d ", ans[i]); printf("\n"); } return 0; }