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\n%lld\n%lld\n%lld\n%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
无聊就学习 反正没事干

浙公网安备 33010602011771号