当前位置: 代码迷 >> 综合 >> Acwing 4301. 截断数列
  详细解决方案

Acwing 4301. 截断数列

热度:89   发布时间:2023-12-04 03:19:23.0

给定一个由 n 位数字组成的序列 a1a2…an.

其中,每个数字都是 0?9之一。

请你判断,能否将数列从中间截断为两个或更多个非空部分,要求每一部分的各位数字之和都相等。

例如,350178 可以截断为 3 个部分 350、17、8,并且满足 3+5+0=1+7=8。

输入格式

第一行包含一个整数 n。

第二行包含 n个数字 a1,a2,…,an,数字之间不含空格。

输出格式

如果可以按要求截断数列,则输出 YES,否则输出 NO

数据范围

前 6个测试点满足 2≤n≤10。
所有测试点满足 2≤n≤100,0≤ai≤9。

直接枚举

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+100;
typedef pair<int,int> PII; 
#define x first
#define y second
#define INF 0x3f3f3f3f
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
const int mod=1e9+7;
int n,m;
int a[N];
int sum;
int main()
{string st;cin>>n;cin>>st;for(int i=0;i<n;i++){ a[i]=st[i]-'0';sum+=a[i];}for(int i=2;i<=n;i++)     //枚举分成的段数{if(sum%i==0)         //如果能整除才能继续判断{int f=sum/i,flag=1;for(int j=0,s=0;j<n;j++){s+=a[j];if(s>f)        // 如果超过f 则之后只会越来越大,则不合法{flag=0;break;}else if(s==f)   //初始为0s=0;}if(flag){cout<<"YES"<<endl;return 0;}}}cout<<"NO"<<endl;return 0;
}