201909-2 小明种苹果(续)

题目如下:

  第一次的代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
#define M 1010
int main(){
	int c;
	long long p=0,q=0,r=0,s=0,t=0;
	scanf("%d",&c);
	long long m[M],n[M];
	bool a[M][M] ={false};
	for(long long i=0;i<c;i++){
	scanf("%lld%lld",&m[i],&n[i]);
	a[m[i]][n[i]]=true;
	}
	for(long long i=0;i<M;i++) {
		for(long long j=0;j<M;j++){
			if(a[i][j]){
				if(a[i+1][j]&&a[i-1][j]&&a[i][j+1]&&a[i][j-1]){
				if(a[i+1][j-1]&&a[i-1][j-1]&&a[i-1][j+1]&&a[i+1][j+1])
					t++;
				else if((a[i+1][j-1]&&a[i-1][j-1]&&a[i-1][j+1])||(a[i+1][j-1]&&a[i-1][j-1]&&a[i+1][j+1])||(a[i+1][j-1]&&a[i-1][j+1]&&a[i+1][j+1])||(a[i-1][j-1]&&a[i-1][j+1]&&a[i+1][j+1]))
					s++;
				else if((a[i+1][j-1]&&a[i-1][j-1])||(a[i+1][j-1]&&a[i-1][j+1])||(a[i+1][j-1]&&a[i+1][j+1])||(a[i-1][j-1]&&a[i-1][j+1])||(a[i-1][j+1]&&a[i+1][j+1])||(a[i-1][j-1]&&a[i+1][j+1]))
					r++;
				else
					q++;
				}
			}
		}
	}
	printf("%lld
%lld
%lld
%lld
%lld",p,q,r,s,t);
}

思路:

1.算出T比较容易

2.算D,有点容易出错,一棵树顶多只能加一次D

3.算E,最难,始终不会实现循环,用求余的方法即可

正确代码如下:

#include<cstdio> 
#include<iostream> 
#include<algorithm>
using namespace std;
int main(){
	int T=0,n,m,x,D=0,E=0,a;
	cin>>n;
	bool f[n]={};
	for(int i=0;i<n;i++){
		cin>>m>>x;
		int y=x;
		for(int j=1;j<m;j++){
			cin>>a;
			if(a<=0)
			y+=a;
			else{
				if(a<y){
//				D++; 不可以在这个地方直接加 ,如果第一颗树发生了多次掉落
//    那么会重复计算 
				f[i]=true;
				}
				y=a;	
			}
		}
		T+=y; 
		}
		for(int i=0;i<n;i++)
		if(f[i])
		D++;
		for(int i=0;i<n;i++){
			if(f[i]&&f[(i+1)%n]&&f[(i+2)%n]) 
			E++;
		}  //如何算循环的
	cout<<T<<" " <<D<<" "<<E;
	return 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

//4
//4 74 -7 -12 -5
//5 73 -8 -6 59 -4
//5 76 -5 -10 60 -2
//5 80 -6 -15 59 0

  

无聊就学习 反正没事干
原文地址:https://www.cnblogs.com/miao-xixixi/p/13704838.html