Good Ticket
当时写的时候挺没思路的,就一直在考虑分为x个相同值的部分,肯定sum%x==0, ,i从n循环,找出能整除的,后面判断奇偶,一顿操作猛如虎,其实错的很离谱,那晚请教了做对的同学加上自己的理解,理清了思路,现在此记录一下
思路:首先假如说可以分成相同值的部分,那么至少是两部分,每一部分是这一串数字总和的二分之一,那么我们就可以用外循环遍历从1到二分之sum,找出这个相同值,假设当前的i就是相同值,内循环从第一个数字开始叠加,如果内循环里的数字或者内循环的数字之和比当前i要打大,就证明当前i不是要找的相同值,且比相同值要小,外层循环i++,加到与当前的内循环的和相等,这时候我们假定i就是相同值,内循环的sum2需重新归0,验证后面的的数的相同值是不是也是i,如果找到的i就是相同值的话,最后内循环结束是sum2的值处于归零状态,如果没找到的话,分为两种没找到的情况,举个栗子,1248,i更新为7的时候,sum2和i相等,sum2归0,最后一位数是8,但是外循环的i只能到sum1的二分之一,我们的sum2就无法归0,另一个栗子,1246,i更新为7,sum2和i相等,sum2归0,最后一位是6,但是内循环已经结素,sum2和i不相等,sum2仍无归0,总结下来就是说,如果sum2最后的值不是0,那就没找到有相同值
唉,感觉说的不太好,有点绕。。
AC代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n;
char str[1000];
int sum1, sum2;
int flag=0;
int check() {
for (int i = 0; i <= sum1 / 2; i++) {
//要是能分成有相同值的部分,最少是两部分,所以取sum/2sum2 = 0;if(flag==1)break;for (int j = 0; j < n; j++) {
sum2 += str[j] - '0';if (sum2 > i || str[j]-'0' > i)break;if (sum2 == i) {
sum2 = 0;flag = 1;} }if(sum2!=0)flag=0;}return flag;
}
int main() {
cin >> n;sum1 = 0;scanf("%s",str);for (int i = 0; i < n; i++) {
sum1 += str[i]-'0';}if(check())cout<<"YES"<<endl;elsecout<<"NO"<<endl;
}