CCF-CSP 201909-2 小明种苹果(续)

CCF-CSP 201909-2 小明种苹果(续)_第1张图片
CCF-CSP 201909-2 小明种苹果(续)_第2张图片
CCF-CSP 201909-2 小明种苹果(续)_第3张图片

解题思路:
用一个长度为n+2的数组,用于记录某棵树是否掉落苹果。之所以比n多加个2,是因为模拟循环。
即:drops[0]=drops[n]; drops[1]=drops[n+1];
开头两个和最后两个相等,用以模拟环。

经验总结:
如果某棵树被记录为掉落的树,那么记录一次即可, 不能多次记录。否则就会出错,这题考试时只得了50分,就是没有考虑到这点。

C++代码:

#include
using namespace std;
int main() {
	int n,m,D = 0,E = 0,T = 0;
	scanf("%d",&n);
	int drops[n+2] = {0};
	for(int i=0; i<n; i++) {
		int a,b;
		bool flag_drop = true;
		scanf("%d %d",&m,&a);
		for(int j=1; j<m; j++) {
			scanf("%d",&b);
			if(b>0&&a!=b) {
				if(flag_drop) { //注意这里一定要加个判断,某棵树掉落一次统计一次即可,多次统计会出现错误
					drops[i+2] = 1;
					D++; //如果多次统计掉落,D值会变大
				}
				a = b;
				flag_drop = false;
			} else if(b<=0) {
				a += b;
			}
		}
		T += a;
	}
	drops[0]=drops[n];
	drops[1]=drops[n+1];
	for(int i=1; i<n+1; i++) {
		if(1 == drops[i-1] && 1 == drops[i] && 1 == drops[i+1]) {
			E++;
		}
	}
	printf("%d %d %d",T,D,E);
	return 0;
}

你可能感兴趣的:(CCF-CSP)