题目
题意翻译
最近Vasya发现了一张黄金卡,卡号由n个数字组成:a1 a2 a3 …an
Vasya认为一张票是幸运的,如果它可以被划分成两个或更多个等量的非相交段。
例如,机票 350178 是幸运的,因为它可以分为三个段350、350、17和8。 3+5+0=1+7=8 注意序列的每个数字都应该属于一个段。 帮帮Vasya!告诉他他找到的金卡卡号是否幸运。 第一行输入 n (1 <= n <= 100). 第二行逐位输入卡号 a1 a2 a3 …an 如果该卡号是幸运的输出 “YES” ,否则"NO"。 (不区分大小写)
Copy自 KagurazakaKano 题解中的题目大意: 给定 n 个长度为 1 的数列,要求是否可以将数列分成两段或多段,使得这些段相加都相等。
题目描述
Recently Vasya found a golden ticket — a sequence which consists of n n digits a_1a_2\dots a_n a
1
a
2
…a
n
. Vasya considers a ticket to be lucky if it can be divided into two or more non-intersecting segments with equal sums. For example, ticket 350178 350178 is lucky since it can be divided into three segments 350 350 , 17 17 and 8 8 : 3+5+0=1+7=8 3+5+0=1+7=8 . Note that each digit of sequence should belong to exactly one segment.
Help Vasya! Tell him if the golden ticket he found is lucky or not.
输入输出格式
输入格式:
The first line contains one integer n n ( 2 \le n \le 100 2≤n≤100 ) — the number of digits in the ticket.
The second line contains n n digits a_1 a_2 \dots a_n a
1
a
2
…a
n
( 0 \le a_i \le 9 0≤a
i
≤9 ) — the golden ticket. Digits are printed without spaces.
输出格式:
If the golden ticket is lucky then print “YES”, otherwise print “NO” (both case insensitive).
输入输出样例
输入样例#1: 复制
5
73452
输出样例#1: 复制
YES
输入样例#2: 复制
4
1248
输出样例#2: 复制
NO
说明
In the first example the ticket can be divided into 7 7 , 34 34 and 52 52 : 7=3+4=5+2 7=3+4=5+2 .
In the second example it is impossible to divide ticket into segments with equal sum.
思路
一个显而易见的结论:必然有一段从1开始
从1开始的那段的和必然是一个前缀和
一共有n个前缀和
枚举前缀和然后判断即可
代码
#include <bits/stdc++.h>
using namespace std;
int a[105];
int f[105] = {0};
int main(){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%1d",&a[i]);
f[i] = f[i - 1] + a[i];
}
for(int i = 1; i <= n; i++){
bool fg = 0;
int cur = 0;
int fni = f[n] / i;
int C = f[n] % i;
if((C == 0) && (fni != 0)){
for(int j = 1; j <= n; j++){
cur += a[j];
if(cur > f[n] / i){
fg = 1;
break;
} else {
cur %= (f[n] / i);
}
}
if(fg){
continue;
} else if((cur % (f[n] / i) == 0) && (i > 1)){
printf("YES\n");
return 0;
}
}
}
if((n >= 2) && (f[n] == 0)){
printf("YES\n"); //特判
return 0;
}
printf("NO\n");
return 0;
}