题目如下:
第一次的代码如下:
#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