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); 
     
}

 

posted @ 2021-04-10 19:04  mememelody  阅读(104)  评论(0)    收藏  举报