站外题求助 悬关
  • 板块灌水区
  • 楼主longxiaozhi
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/1/16 01:42
  • 上次更新2025/1/16 09:09:52
查看原帖
站外题求助 悬关
961067
longxiaozhi楼主2025/1/16 01:42

题目描述 小田 很喜欢把数组分成几个部分,这一次,小田 决定把 数组 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;
}
2025/1/16 01:42
加载中...