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

0 效果

在这里插入图片描述
难点:如何处理环

1 题目

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

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
*/
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页