【CF1030C】 Vasya and Golden Ticket

题目

题意翻译
最近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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值