题目描述 小田 很喜欢把数组分成几个部分,这一次,小田 决定把 数组 a a 分割成好几段(最少是一段),使得每一段的元素之和都不为 0 0。
需要注意的是,每一段数组的元素应该是连续的,例如有数组 [ 1 , 2 , 3 , 4 , 5 ] [1,2,3,4,5]
这里演示了一种合理的分段方式: [ 1 , 2 , 3 ] , [ 4 , 5 ] [1,2,3],[4,5], 这里演示了一种不合理的分段方式: [ 1 , 2 , 4 ] , [ 3 , 5 ] [1,2,4],[3,5]。 输入 第一行输入一个正整数 n n,表示数组元素的数量。
第二行输入 n n 个整数 a i a i 。
1 ≤ n ≤ 100 , − 1 0 3 ≤ a i ≤ 1 0 3 1≤n≤100,−10 3 ≤a i ≤10 3
输出 如果没有合理的分割方式,输出 NO 。
否则: 在第一行输出 YES。 第二行输出一个整数 k k,表示新数组的个数。 接下来 k k 行,每行输出两个整数 l i l i 和 r i r i ,表示第 i i 个新数组的左端点和右端点在原数组中的下标。
l i , r i l i ,r i 应该按从小到大的顺序排列。
如果有多种分割方式,你只需要输出其中一种即可。
#include<cstdio>
using namespace std;
int main()
{
int m = 0,n,a,sum = 0,l[110],r[110];
scanf("%d",&n);
for(int i = 1;i <= n;i++){
scanf("%d",&a);
if(m == 0 && a == 0){
m = 1;
sum = sum + 1;
l[sum] = i;
if(i == n){
if(sum == 1){
printf("NO");
return 0;
}
else{
break;
}
}
}
if(a != 0 && (m == 1 || m == 0)){
if(m == 0){
sum = sum + 1;
l[sum] = i;
}
m = 2;
if(i == n){
r[sum] = i;
break;
}
}
if(a != 0 && m == 2){
r[sum] = i - 1;
sum = sum + 1;
l[sum] = i;
if(i == n){
r[sum] = i;
break;
}
}
if(m == 2 && a == 0){
m = 3;
if(i == n){
r[sum] = i;
break;
}
}
if(m == 3 && a != 0){
r[sum] = i - 1;
if(i == n){
r[sum] = i;
break;
}
sum = sum + 1;
l[sum] = i;
m = 2;
}
}
printf("YES\n%d\n",sum - 1);
for(int i = 2;i <= sum;i++){
printf("%d %d\n",l[i],r[i]);
}
return 0;
}