文章目录

  • ​​0 效果​​
  • ​​1 题目​​
  • ​​2 思路​​
  • ​​3 代码​​

0 效果

小明种苹果(续)(201909-2/CCF)———附带思路和完整代码_数据结构

难点:如何处理环

1 题目

小明种苹果(续)(201909-2/CCF)———附带思路和完整代码_1024程序员节_02

小明种苹果(续)(201909-2/CCF)———附带思路和完整代码_数据结构_03小明种苹果(续)(201909-2/CCF)———附带思路和完整代码_CCF_04

2 思路

  • 1记录输入的每次值,按N和M依次输入数据,
  • 2 当输入树的操作数据时,如果是第一次输入,则临时存储数据A为tempT,每当输入A小于0时,累加到tempT上,
  • 如果A大于0并且不是第一次输入,则与tempT比较,如果不同,则存在掉落的情况,记hashTable[num]为true【num为树的编号,从0开始】,并且重置tempT为刚刚输入的A
  • 3 每行输入完后,把tempT累加到T上,如果hashTable[num]为true,则对D进行加1
  • 4 计算连续三棵为掉落的树的个数E,对i从[0,N)进行循环,如果hashTable[i]、hashTable[(i+1)%N]、hashTable[(i+2)%N]都是true,则E++;【例如树的编号上限为3(从0开始),处理到2的时候,就会计算2,3,(2+2)% 4 = 0,正好符合题意】
  • 5 另一种计算E的方法,如果cnt的个数为3,则E++并且重新令cnt为2【因为此时三棵树的最左边一颗树已经不参与计算了】,
  • 当hashTable[i]为false时,对cnt进行清零;
  • 当hashTable[i]为true时,cnt++;

3 代码

#include<cstdio>
const int MAXN = 1010;
bool hashTable[MAXN] = {false};

int main(){
int N, M, A, D = 0, E = 0;
long long T = 0;
scanf("%d", &N);
for(int num = 0; num < N;num++){
scanf("%d", &M);
int tempT = 0;
for(int i = 0; i < M;i++){
scanf("%d", &A);
if(i != 0 && A > 0 && A != tempT){
hashTable[num] = true;
}
if(i == 0 || A > 0) tempT = A;
else tempT += A;
}
T+= tempT;
if(hashTable[num] == true) D++;
}

for(int i = 0;i < N;i++){
//取余数来处理环
if(hashTable[i] == true && hashTable[(i+1)%N] == true && hashTable[(i+2)%N] == true) E++;
}
/*
//处理环的方法二:
int cnt = 0;
int index = 0;
for(int num = 0; num < N + 2;num++){
if(num >= N) index = num - N;
else index = num;

if(hashTable[index] == true) cnt++;
else cnt = 0;
if(cnt == 3){
E++;
cnt = 2;
}
}
*/

printf("%d %d %d", T, D, E);
return 0;
}
/*
4
4 74 -7 -12 -5
5 73 -8 -6 59 -4
5 76 -5 -10 60 -2
5 80 -6 -15 59 0

5
4 10 0 9 0
4 10 -2 7 0
2 10 0
4 10 -3 5 0
4 10 -1 8 0
*/