VJ传送门:https://vjudge.net/problem/CodeForces-754A
题意:给定一个整数数组,将其拆分成若干子数组,要求如下:
- 各个子数组内元素和都不为0
- 子数组的各个元素必须保持原数组的顺序
- 如果有多种可能,只要求输出其中的一种
思路:先求原数组的前缀和,在分情况讨论:
- 所有元素和不为0,这种情况下,1~n,即原数组就满足条件,直接输出即可
所有元素和为0,这种情况下,只要遍历前缀和数组sum,找到满足sum[k]!=0的k,则1~k,k+1~n就是要找的子数组,因为sum[k]!=0,sum[n]=0,则
代码:
#include<iostream>
using namespace std;
int a[10007], ans[10007];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
ans[i]+=ans[i-1]+a[i];
}
if(ans[n]!=0){
cout<<"YES\n1"<<endl;
cout<<"1 "<<n<<endl;
return 0;
}else{
for(int i=1;i<=n;++i){
if(ans[i]!=0){
cout<<"YES\n2"<<endl;
cout<<"1 "<<i<<endl;
cout<<i+1<<" "<<n<<endl;
return 0;
}
}
cout<<"NO"<<endl;
}
return 0;
}