题目:

我的代码:

#include<stdio.h>
const int max = 1005;
int main()
{
	int i, n, j, m, a, sum = 0, dropt = 0;
	int tree[max][2];
	scanf("%d",&n);
	for(i = 1;i <= n;i++) {
		scanf("%d",&m);
		scanf("%d",&tree[i][0]); //第i棵树的苹果数量
		tree[i][1] = 0; //表示没有发生掉落
		for(j = 1;j < m;j++) {
			scanf("%d",&a);
			if(a <= 0) {
				tree[i][0] += a; //因为a是负数,加上a等于减去a
			} else if(a > 0) {
				if(tree[i][0] != a) { //掉落了
					tree[i][0] = a;
					tree[i][1] = 1;
				}
			}
		}
		if(tree[i][1] == 1) {
			dropt += 1;
		}
		sum += tree[i][0];
	}
	int e = 0;
	tree[0][0] = tree[n][0];   tree[0][1] = tree[n][1];
	tree[n+1][0] = tree[1][0]; tree[n+1][1] = tree[1][1];
	for(i = 1;i <= n;i++) {
		if(tree[i][1] == 0) {
			i++;
		} else { //==1
			if (tree[i-1][1] == 1) {
				if (tree[i+1][1] == 1) {
					e += 1;
				} else {
					i += 2;
				}
			}
		}
	}
	printf("%d %d %d",sum,dropt,e);
	return 0;
}

 运行通过,耗时78ms,还是挺满意的结果啦。

和第一道题差不了太多,个人认为我的时间在求e(多少组连续掉落)时通过判断连续跳过节点来节省了很多。很多思路和第一道题非常相似,基本上输入时就把需要判断的以及计算的都计算得差不多了。

12-24 20:07