CSP 201909-02 小明种苹果(续)100分
终于知道50分扣哪了,最开始算的是掉落的次数,每掉一次就D++,但是求的是苹果数棵数,一棵树可以掉落很多次,所以最后用D_drop[]求和来计算,改了一行代码就好啦!
注意第27、41行。
1 #include<cstdio> 2 #define N 1010 3 #define M 1010 4 #define _for(i,a,b) for(int i=(a);i<(b);++i) 5 int n; 6 int m[N][M]={0}; 7 int T[N]={0}; 8 int Tans=0; 9 int D=0; //发生掉落的苹果树数量 10 int E=0; 11 12 int main(){ 13 scanf("%d",&n); 14 int D_drop[n+1]={0}; 15 _for(i,1,n+1){ //第一列即 m[i][0]用来记录m的值,确定这一行要输入几次 16 scanf("%d",&m[i][0]); 17 _for(j,1,m[i][0]+1){ //最好画一下确定数组下标 18 scanf("%d",&m[i][j]); 19 } 20 } 21 22 _for(i,1,n+1){ 23 T[i]= m[i][1]; //初始设为第一个数,在此基础上,如果后面是0或负数,就连续做加法;如果有正数,覆盖原来的T 24 for(int j =1 ;j<m[i][0]+1;++j){ 25 if(m[i][j]>0){ 26 if(m[i][j]<T[i]){ //如果重新计数小于应有的,说明掉了 27 //D++; //!!问题在这,统计的是掉落苹果的棵数,而不是次数!一颗树掉落两次就会出错,因为多算一次 28 D_drop[i]=1; 29 30 } 31 T[i]=m[i][j]; 32 } 33 else{ 34 T[i]+=m[i][j]; 35 } 36 } 37 } 38 _for(i,1,n+1){ 39 Tans+=T[i]; 40 //可以用 D_drop[]求解 掉落的棵树 41 D+=D_drop[i]; 42 } 43 // T 计算完毕 44 45 if(D>=3){ 46 for(int i=1;i<n+1;++i){ 47 if(D_drop[(i-1)%n+1]&D_drop[(i)%n+1]&D_drop[(i+1)%n+1]) 48 E++; 49 } 50 } 51 printf("%d %d %d", Tans,D,E); 52 }
经过三次调整,分别得了20、30,50。
虽然我的逻辑很不绕弯子(有点low
但应该答案是对的呀,按照给定的样例结果也是正确的,大概我还不熟悉怎么自己设计测试样例(尤其是边界条件)
先把代码贴上,可以优化的细节和大的地方都有,先一个一个改着吧,毕竟这是目前练过的唯一能过的一套卷子了,呜呜呜呜,继续敲了~
#include<cstdio> #define N 1010 #define M 1010 #define _for(i,a,b) for(int i=(a);i<(b);++i) int n; int m[N][M]={0}; int T[N]={0}; int Tans=0; int D=0; //发生掉落的苹果树数量 int E=0; int main(){ scanf("%d",&n); int D_drop[n+1]={0}; _for(i,1,n+1){ //第一列即 m[i][0]用来记录m的值,确定这一行要输入几次 scanf("%d",&m[i][0]); _for(j,1,m[i][0]+1){ //最好画一下确定数组下标 scanf("%d",&m[i][j]); // printf("\n "); // if(j!=m[i][0]) // printf("%d ",m[i][j]); // else // printf("%d\n",m[i][j]); } } //输入完成,输入数组没问题 //计算苹果总数T //!!倒着数不行,因为这种情况仅限于正数之前是负数的,也就是进行了重新计数的。倒着数,如果大于零,第i棵树的苹果数就是这个值 ,加上 ,跳出本行 for循环 //但实际上,没有重新计数的,要用上一次统计的数字减去疏果数量 _for(i,1,n+1){ T[i]= m[i][1]; //初始设为第一个数,在此基础上,如果后面是0或负数,就连续做加法;如果有正数,覆盖原来的T for(int j =1 ;j<m[i][0]+1;++j){ if(m[i][j]>0){ if(m[i][j]<T[i]){ //如果重新计数小于应有的,说明掉了 D++; D_drop[i]=1; } T[i]=m[i][j]; } else{ T[i]+=m[i][j]; } } } _for(i,1,n+1){ Tans+=T[i]; } // T 计算完毕 if(D<3){ E=0; } else{ for(int i=2;i<n;++i){ if(D_drop[i-1]&D_drop[i]&D_drop[i+1]) E++; } if(D_drop[1]&D_drop[n]&D_drop[2]) E++; if(D_drop[1]&D_drop[n]&D_drop[n-1]) E++; } printf("%d %d %d", Tans,D,E); }
把最后循环取余判断一组的代码修改之后,还是50分。。
#include<cstdio> #define N 1010 #define M 1010 #define _for(i,a,b) for(int i=(a);i<(b);++i) int n; int m[N][M]={0}; int T[N]={0}; int Tans=0; int D=0; //发生掉落的苹果树数量 int E=0; int main(){ scanf("%d",&n); int D_drop[n+1]={0}; _for(i,1,n+1){ //第一列即 m[i][0]用来记录m的值,确定这一行要输入几次 scanf("%d",&m[i][0]); _for(j,1,m[i][0]+1){ //最好画一下确定数组下标 scanf("%d",&m[i][j]); // printf("\n "); // if(j!=m[i][0]) // printf("%d ",m[i][j]); // else // printf("%d\n",m[i][j]); } } //输入完成,输入数组没问题 //计算苹果总数T _for(i,1,n+1){ T[i]= m[i][1]; //初始设为第一个数,在此基础上,如果后面是0或负数,就连续做加法;如果有正数,覆盖原来的T for(int j =1 ;j<m[i][0]+1;++j){ if(m[i][j]>0){ if(m[i][j]<T[i]){ //如果重新计数小于应有的,说明掉了 D++; D_drop[i]=1; } T[i]=m[i][j]; } else{ T[i]+=m[i][j]; } } } _for(i,1,n+1){ Tans+=T[i]; } // T 计算完毕 if(D>=3){ for(int i=1;i<n+1;++i){ if(D_drop[(i-1)%n+1]&D_drop[(i)%n+1]&D_drop[(i+1)%n+1]) E++; } } printf("%d %d %d", Tans,D,E); }

浙公网安备 33010602011771号