题目:
我的代码:
#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(多少组连续掉落)时通过判断连续跳过节点来节省了很多。很多思路和第一道题非常相似,基本上输入时就把需要判断的以及计算的都计算得差不多了。