洛谷题目按难度点评---入门难度

洛谷题目按难度点评---入门难度

1.p1421 小玉买文具
难度:入门难度
考点:输入,输出,整数的四则运算
适用:小学生

#include <stdio.h>
int main(){
    int a,b,c;
    scanf("%d%d",&a,&b);
    c=(a*10+b)/19;
    printf("%d\n",c);
    return 0;
}
2.p1888 三角函数
难度:入门难度
考点:三角函数,三角形角边简单特征,输入,输出 ,欧几里德算法(辗转相除法),若不使用,容易超时,排序
陷阱:超时,求最大公约数时,不使用欧几里德算法,容易超时。
适用:初中生,若是小学生,要提前学些三角函数及三角形简单特性,欧几里德算法

#include <stdio.h>

int k=1;
void gcd(int a,int b){
    if(b==0){
        k=a;
        return;
    }
    gcd(b,a%b);
}
int main(){
    int c[3];
    int i,j,t;
    int a,b;
    for(i=0;i<=2;i++)
        scanf("%d",&c[i]);
    for(i=0;i<=2;i++)//由大到小排序 
        for(j=i+1;j<=2;j++)
            if(c[i]<c[j]){
                t=c[i];
                c[i]=c[j];
                c[j]=t;
            }
    a=c[0];//斜边 
    b=c[2];//最小直角边
    gcd(a,b);
    printf("%d/%d\n",b/k,a/k); 
    return 0;
} 

方法二:2017-10-16 18:44

#include <stdio.h>
//TLE 10^9 10^6
//朴素算法 
//gcd 欧几里德算法 
int main(){
    int a,min=1999999999,max=-1,i,k;
    for(i=0;i<3;i++){
        scanf("%d",&a);
        if(a<min)min=a;
        if(a>max)max=a;
    }
    for(i=1;i<=min;i++)
        if(min%i==0&&max%i==0)k=i;
    printf("%d/%d\n",min/k,max/k);
    return 0;
}

方法三:2017-10-16 18:46

#include <stdio.h>
//TLE 10^9 10^6
//朴素算法 
//gcd 欧几里德算法
int gcd(int a,int b){
    if(b==0)return a;
    return gcd(b,a%b);
} 
int main(){
    int a,min=1999999999,max=-1,i,k;
    for(i=0;i<3;i++){
        scanf("%d",&a);
        if(a<min)min=a;
        if(a>max)max=a;
    }
    k=gcd(max,min);
    printf("%d/%d\n",min/k,max/k);
    return 0;
}
本人偏好方法三。


3.p1567 统计天数
难度:入门难度
考点:输入,输出 ,数组,找最大值  
适用:小学生
注意:过大的数组要开到main函数的外面。
感悟:有动态规划中,最长上升子序列的味道。

#include <stdio.h>
int a[10000000+10];
int d[10000000+10];
int main(){
    int n,i,j;
    int max;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    d[0]=1;
    for(i=1;i<n;i++){
        d[i]=1;
        if(a[i-1]<a[i])
            d[i]+=d[i-1];
    }
    max=0;
    for(i=0;i<n;i++)
        if(d[i]>max)
            max=d[i];
    printf("%d\n",max);
    return 0;
} 

4.p1420 最长连号 此题与 p1567 统计天数 类似
难度:入门难度
考点:输入,输出 ,数组,找最大值  
适用:小学生
注意:过大的数组要开到main函数的外面。
感悟:有动态规划中,最长上升子序列的味道。

#include <stdio.h>
int a[10000+10];
int d[10000+10];
int main(){
    int n,i;
    int max;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    d[0]=1;
    for(i=1;i<n;i++){
        d[i]=1;
        if(a[i]==a[i-1]+1)
            d[i]+=d[i-1];
    }
    max=0;
    for(i=0;i<n;i++)
        if(max<d[i])
            max=d[i];
    printf("%d\n",max);
} 

5.p2006 赵神牛的游戏
难度:入门难度
考点:输入,输出 ,数组,整数四则运算  
适用:小学生
注意:过大的数组要开到main函数的外面。
小技巧:要设置一个计数变量
陷阱:没注意到陷阱,该题得分为70,陷阱是a[i],b[i]均可能是0,即除数有可能是0

#include <stdio.h>
int a[30000+10],b[30000+10],c[30000+10];
int main(){
    int k,m,n;
    int i,j;
    int count=0;
    scanf("%d%d%d",&k,&m,&n);
    for(i=1;i<=m;i++){
        scanf("%d%d",&a[i],&b[i]);
        if(a[i]==0&&b[i]==0)
            c[i]=0;
        else if(a[i]==0&&b[i]!=0)
            c[i]=n;
        else
            c[i]=k/a[i]*b[i];
    }
    for(i=1;i<=m;i++)
        if(c[i]>=n){
            count++;
            if(count==1)
                printf("%d",i);
            else
                printf(" %d",i);
        }
    if(count==0)
        printf("-1\n");
    else
        printf("\n");
    return 0;
} 

6.p1425 小鱼的游泳时间 类似 P1421 小玉买文具
难度:入门难度
考点:输入,输出 ,整数四则运算,取整,取模  
适用:小学生

#include <stdio.h>
int main(){
    int a,b,c,d;
    int e,f,g,h,i;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    e=a*60+b;
    f=c*60+d;
    g=f-e;
    h=g/60;
    i=g%60;
    printf("%d %d\n",h,i);
    return 0;
} 

7.p1876 开灯
难度:入门难度
考点:输入,输出 ,整数四则运算  
适用:小学生
技巧:按照题意,按部就班,肯定超时。故采用枚举n=1......10查找亮灯规律,发现亮的灯满足1^2,2^2,3^2,k^2<=n
n=1  1
n=2  1
n=3  1
n=4  1 4
n=5  1 4
n=6  1 4
n=7  1 4
n=8  1 4
n=9  1 4 9
n=10 1 4 9
感悟:枚举,找规律,纸笔省不了了。该题难在思考上。

#include <stdio.h>

int main(){
    long long n;
    long long i;
    scanf("%lld",&n);
    for(i=1;i*i<=n;i++)
        if(i==1)
            printf("%d",i*i);
        else
            printf(" %d",i*i);
    printf("\n");
    return 0;
} 

8.p1634 禽兽的传染病
难度:入门难度
考点:输入,输出 ,整数四则运算,long long  
适用:小学生
感悟:动笔找规律是必要的,该题的推导容易上当,一种错误如下:
n=1 1+x
n=2 (1+x)^2
n=3 (1+x)^2*(1+x)^2
正确如下:
n=1 1+x
n=2 1+x+(1+x)*x
n=3 1+x+(1+x)*x+(1+x+(1+x)*x)*x

#include <stdio.h>
int main(){
    long long x,n;
    long long i;
    long long ans;
    scanf("%lld%lld",&x,&n);
    ans=1+x;
    for(i=2;i<=n;i++)
        ans=ans+ans*x;
    printf("%lld\n",ans);
    return 0;
}

9.p2192 HXY玩卡片
题目有问题:样例1改成-1,题目没有问题,样例1输出确实是0
难度:入门难度
考点:输入,输出 ,取整  
适用:小学生
感悟:因n<=1000,故正常的将输出的数用一个整数来表示,不现实。
该题演变为5的个数必须是9的整数倍,多出的尾巴位置可用0填充。
小技巧:统计5与0的个数
陷阱:输出结果可以是0,此处容易忽略。

#include <stdio.h>
int main(){
    int n;
    int count5=0,count0=0;
    int i,v;
    int num;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&v);
        if(v==5)
            count5++;
        else
            count0++;
    }
    if(count5/9<1){
        if(count0==0) 
            printf("-1\n");
        else//输出结果可以是0,此处容易漏 
            printf("0\n");
    } 
    else if(count0==0)
        printf("-1\n");
    else{
        num=count5/9*9;
        for(i=1;i<=num;i++)
            printf("5");
        for(i=1;i<=count0;i++)
            printf("0");
        printf("\n");
    } 
    return 0;
}

10.p1150 Peter的烟
难度:入门难度
考点:输入,输出 ,整数四则运算,取整,取模  
适用:小学生  
小技巧:烟蒂数目是整个代码的核心。

#include <stdio.h>
int main(){
    int n,k;
    int sum=0;//香烟 
    int d;//烟蒂 
    scanf("%d%d",&n,&k);
    d=n;
    sum+=n;
    while(d/k){
        sum+=d/k;
        d=d/k+d%k;
    }
    printf("%d\n",sum);
    return 0;
} 

11.p1590 失踪的7 
难度:入门难度
考点:输入,输出 ,整数四则运算,取整,取模 ,long long,栈 
适用:小学生 
注意:过大的数组要开到main函数的外面。 
小技巧:枚举,找规律,采用9进制8-7,9-8,分离出个十百千等位进行计算 
陷阱:注意,不仅仅个位上有7,十位上也可以有7,百位上也可以有7,这是容易遗漏的地方
感悟:改代码,牵一发而动全身,一处改了,其它地方也得查。

#include <stdio.h>
long long a[1000000];
long long b[1000000];//栈 
long long mul(long long t){//次方函数9^t 
    long long i;
    long long ans=1;
    for(i=1;i<=t;i++)
        ans*=9;
    return ans;
}
int main(){
    long long t;
    long long i,j;
    long long ans;
    long long top;
    scanf("%lld",&t);
    for(i=1;i<=t;i++)
        scanf("%lld",&a[i]); 
    
    for(i=1;i<=t;i++){
        top=-1;
        while(a[i]){//分离出个十百千位等 
            top++;
            if(a[i]%10>7)
                b[top]=(a[i]%10-1);
            else
                b[top]=a[i]%10;
            a[i]/=10;
        }
        ans=0;
        for(j=top;j>=0;j--)
            ans+=b[j]*mul(j);
        printf("%lld\n",ans);
    }
    return 0;
} 

12.p2689 东南西北 
题目的问题:题目描述求最少时间,输出格式 最少多少步,最终确认求步数
样例1解释,应为 向东走一步,向北走一步。 
难度:入门难度
考点:输入,输出 ,数组,C(字符串操作),C++(字符读取)  
适用:初中生,若是小学生,需介绍坐标,负数 
感悟:纸笔画图模拟。涉及字符的读取,C++要比C方便多了

#include <stdio.h>
#include <string.h>
int main(){
    int x1,y1,x2,y2;
    int t;
    int i,k;
    char st[3];
    char s[100];
    int dir[4];//四个方向dir[0]北,dir[1]南,dir[2]西,dir[3]东 
    int len;
    int need[4];//需要的四个方向need[0]北,need[1]南,need[2]西,need[3]东 
    scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    scanf("%d",&t);
    k=0;
    for(i=1;i<=t;i++){
        scanf("%s",st);
        s[k++]=st[0];
    }
    s[k]='\0';//字符串结束标志
    len=strlen(s);
    memset(dir,0,sizeof(dir));
    for(i=0;i<len;i++)//读取输入的风向 
        if(s[i]=='N')//北 
            dir[0]++;
        else if(s[i]=='S')//南 
            dir[1]++;
        else if(s[i]=='W')//西,此处写成'E',查了好一会 
            dir[2]++;
        else//东 
            dir[3]++; 
    memset(need,0,sizeof(need));
    if(x2-x1>=0)//东 
        need[3]=x2-x1;
    else//西 
        need[2]=x1-x2;
    if(y2-y1>=0)//北 
        need[0]=y2-y1;
    else//南 
        need[1]=y1-y2;
    
    if(dir[0]>=need[0]&&dir[1]>=need[1]&&dir[2]>=need[2]&&dir[3]>=need[3])
        printf("%d\n",need[0]+need[1]+need[2]+need[3]);
    else
        printf("-1\n");
    return 0;
}

13.p1046 陶陶摘苹果 
难度:入门难度
考点:输入,输出 ,整数四则运算,数组 
适用:小学生
感悟:菜题

#include <stdio.h>
int main(){
    int h[10+10];
    int i;
    int t;
    int count=0;
    for(i=0;i<10;i++)
        scanf("%d",&h[i]);
    scanf("%d",&t);
    for(i=0;i<10;i++)
        if(t+30>=h[i])
            count++;
    printf("%d\n",count);
    return 0;
}

14. p1179 数字统计 
难度:入门难度
考点:输入,输出 ,整数四则运算,取整,取模,函数编写,栈,算法时间复杂度  
适用:小学生 
感悟:原本以为该题需要用什么技巧。一看<=100000,立马想到枚举,采用分离个十百千万的做法,数出2的个数。

#include <stdio.h>
int count2(int a){
    int top=-1;
    int b[10];
    int i;
    int count=0;
    while(a){
        top++;
        b[top]=a%10;
        a/=10;
    }
    for(i=0;i<=top;i++)
        if(b[i]==2)
            count++;
    return count;
}
int main(){
    int L,R;
    int ans=0;
    int i;
    scanf("%d%d",&L,&R);
    for(i=L;i<=R;i++)
        ans+=count2(i);
    printf("%d\n",ans);
    return 0;
} 

15.p1909 买铅笔
难度:入门难度
考点:输入,输出 ,取整,取余(取模),结构体  
适用:小学生

#include <stdio.h>
struct node{
    int num;
    int cost;
}p[3];
int main(){
    int n;
    int i;
    int ans[3];
    int min;
    scanf("%d",&n);
    for(i=0;i<3;i++)
        scanf("%d%d",&p[i].num,&p[i].cost);
    for(i=0;i<3;i++){
        if(n%p[i].num==0){//整除
            ans[i]=n/p[i].num*p[i].cost;
        }else{//不能整除
            ans[i]=(n/p[i].num+1)*p[i].cost; 
        }
    }
    min=999999999;
    for(i=0;i<3;i++)
        if(min>ans[i])
            min=ans[i];
    printf("%d\n",min);
    return 0;
}

16.p1035 级数求和 
难度:入门难度
考点:输入,输出 ,整数、浮点数运算,  
适用:小学生 
陷阱:此题写得不好,容易超时 
感悟:测试 12时,已经反应很慢了,比较忐忑. 提交果然超时。本题的特点是容易测试,发现问题,就需要找出超时的问题,进行改进。

#include <stdio.h>
int main(){
    int k;
    int i;
    double ans;
    scanf("%d",&k);
    ans=1;
    i=1;
    while(1){
        if(ans>k)
            break;
        i++;
        ans+=1.0/i;
    }
    printf("%d\n",i);
    return 0;
} 

17.p1085 不高兴的津津 
难度:入门难度
考点:输入,输出 ,整数四则运算,数组,找最大值  
适用:小学生
技巧:大于等于8,痛苦指数为a+b,否者为0

#include <stdio.h>
int main(){
    int a,b,c[8],i,max,k;
    for(i=1;i<=7;i++){
        scanf("%d%d",&a,&b);
        if(a+b>=8)
            c[i]=a+b;
        else
            c[i]=0;
    }
    max=0;
    k=0;
    for(i=1;i<=7;i++)
        if(max<c[i]){
            max=c[i];
            k=i;
        }
    printf("%d\n",k);
    return 0;
}

18. p1075 质因数分解 
难度:入门难度
考点:输入,输出 ,取模  
适用:小学生 
陷阱:题目读起来很吓人,但仔细研读,发现很多条件是限定的。题目比想象中的简单许多了,该数一定是两个质数相乘

#include <stdio.h>
int main(){
    int a,b,c;
    int i;
    scanf("%d",&c);
    for(i=2;i*i<=c;i++)
        if(c%i==0)
            break;
    printf("%d\n",c/i);
    return 0;
} 

19.p1914 小书童---密码
难度:入门难度
考点:输入,输出 ,字符串,字符处理,取模  
适用:小学生

#include <stdio.h>
#include <string.h>
char s[1024];
int main(){
    int n;
    int i;
    int len;
    scanf("%d%s",&n,s);
    len=strlen(s);
    for(i=0;i<len;i++)
        s[i]=(s[i]-'a'+n)%26+'a';
    printf("%s\n",s);
    return 0;
} 

20.p1423 小玉在游泳
难度:入门难度
考点:输入,输出 ,浮点数计算  
适用:小学生

#include <stdio.h>
int main(){
    float x;
    int i;
    float step;
    float ans;
    scanf("%f",&x);
    i=1;
    step=2;
    ans=step;
    while(ans<x){
        i++;
        step*=0.98;
        ans+=step;
    }
    printf("%d\n",i); 
    return 0;
} 

21.p1957 口算练习题 
难度:入门难度
考点:输入,输出 ,整数四则运算,字符串操作,字符转数字,数字转字符  
适用:小学生 
难点:数据格式不统一,造成读写困难

#include <stdio.h>
#include <string.h>
int main(){
    int n;
    int i,j;
    char cmd[50+10][10];
    char last[10];
    char output[100];
    int a[50+10],b[50+10],c[50+10];
    int len;
    scanf("%d",&n);
    scanf("%s%d%d",cmd[1],&a[1],&b[1]);
    strcpy(last,cmd[1]);
    for(i=2;i<=n;i++){//读取 
        scanf("%s",cmd[i]);
        if(cmd[i][0]>='a'&&cmd[i][0]<='z'){
            scanf("%d%d",&a[i],&b[i]);
            strcpy(last,cmd[i]);
        }else{//读取的是数字,将字符串转成数字
            len=strlen(cmd[i]);
            a[i]=0;
            a[i]+=cmd[i][0]-'0';//此处0写成j又是查了半天,低级错误 
            for(j=1;j<len;j++){
                a[i]*=10;
                a[i]+=cmd[i][j]-'0';
            }
            strcpy(cmd[i],last);
            scanf("%d",&b[i]);          
        }
    }
    for(i=1;i<=n;i++){
        switch(cmd[i][0]){
            case 'a':
                c[i]=a[i]+b[i];
                sprintf(output,"%d+%d=%d",a[i],b[i],c[i]);
                printf("%s\n",output);
                printf("%d\n",strlen(output));
                break;
            case 'b':
                c[i]=a[i]-b[i];
                sprintf(output,"%d-%d=%d",a[i],b[i],c[i]);
                printf("%s\n",output);
                printf("%d\n",strlen(output));
                break;
            case 'c':
                c[i]=a[i]*b[i];
                sprintf(output,"%d*%d=%d",a[i],b[i],c[i]);
                printf("%s\n",output);
                printf("%d\n",strlen(output));
                break;
        }
    }
    return 0;
} 

22.P1190 接水问题 
难度:入门难度
考点:输入,输出 ,找最大值,找最小值,函数的写法  
适用:小学生

#include <stdio.h>
int a[100+10];//水龙头数 
int b[10000+10];//人数 
int findmax(int *a,int b,int e){
    int i;
    int max=0;
    int k;
    for(i=b;i<=e;i++)
        if(max<a[i]){
            max=a[i];
            k=i;
        }
    return k;
}
int findmin(int *a,int b,int e){
    int i;
    int min=999999;
    int k;
    for(i=b;i<=e;i++)
        if(min>a[i]){
            min=a[i];
            k=i;
        }
    return k;
}
int main(){
    int i,j;
    int n,m;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&b[i]);
    if(n<=m){//水龙头数多 
        j=findmax(b,1,n);
        printf("%d\n",b[j]);
    }else{//人数多 
        for(i=1;i<=m;i++)
            a[i]=b[i];
        for(i=m+1;i<=n;i++){//加入后续打水学生 
            j=findmin(a,1,m);
            a[j]+=b[i];
        }
        j=findmax(a,1,m);
        printf("%d\n",a[j]);
    }
    return 0;
}

23.p2669 金币 
难度:入门难度
考点:输入,输出 ,整数平方运算,边界处理  
适用:小学生 
难点:边界处理,数据一不小心容易出错,测试,跟踪必不可少。
提醒:在提交前,别忘了删除跟踪代码,可以进行输入输出测试,找出跟踪代码进行删除。

#include <stdio.h>
int main(){
    int k;
    int ans;
    int i;
    scanf("%d",&k);
    //初始化
    i=1;
    ans=0;
    while(k>0){
        k=k-i;
        ans+=i*i;
        i++;
    }
    if(k==0)
        printf("%d\n",ans);
    else{//边界处理 
        i--;//回退数据 
        ans-=i*i;//回退数据 
        k+=i;
        ans+=i*k;
        printf("%d\n",ans);
    } 
    return 0;
}

24.p1980 计数问题 
难度:入门难度
考点:输入,输出 ,取整,取模,分离出整数的个十百千万  
适用:小学生

#include <stdio.h>
int cal(int a,int x){
    int ans;
    ans=0;
    while(a){
        if(a%10==x)
            ans++;
        a/=10;
    }
    return ans;
}
int main(){
    int n,x;
    int i;
    int ans;
    scanf("%d%d",&n,&x);
    ans=0;
    for(i=1;i<=n;i++)
        ans+=cal(i,x);
    printf("%d\n",ans);
    return 0;
}

25.p1059 明明的随机数 
难度:入门难度
考点:输入,输出 ,数组,排序  
适用:小学生

#include <stdio.h>
int main(){
    int n;
    int i,j,t;
    int a[100+10];
    int b[100+10];
    int count;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)//冒泡排序,自小到大 
        for(j=i+1;j<n;j++)
            if(a[i]>a[j]){
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
    count=1;
    b[0]=a[0];
    for(i=1;i<n;i++)
        if(b[count-1]!=a[i])
            b[count++]=a[i];
    printf("%d\n",count);
    printf("%d",b[0]);
    for(i=1;i<count;i++)
        printf(" %d",b[i]);
    printf("\n"); 
    return 0;
}

26.p1307 数字反转
难度:入门难度
考点:输入,输出 ,取整,取模,分离出个十百千万位数,数组  
适用:小学生
陷阱:如9000,反转后是9,不容易想到。

#include <stdio.h>
int main(){
    int n;
    int a[20];
    int top;
    int flag;
    int i,j;
    scanf("%d",&n);
    if(n==0){//n=0处理 
        printf("0\n");
        return 0;
    }
    if(n>0)//大于0 
        flag=1;
    else{//小于0 
        flag=-1;
        n*=-1;
    }    
    top=-1;
    while(n){
        top++;
        a[top]=n%10;
        n/=10;
    }
    if(flag==-1)
        printf("-");
    j=0;
    while(a[j]==0&&j<=top)
        j++;
    for(i=j;i<=top;i++)
        printf("%d",a[i]);
    return 0;
}
27.p2670 扫雷游戏
难度:入门难度
考点:输入,输出 ,字符串操作,米字形遍历,矩阵,函数编写  
适用:小学生
陷阱:研究矩阵是,若用x,y极易出错,建议改成r(row),c(col)这样便于查错,也便于理解

#include <stdio.h>
char s[100+5][100+5];
int b[100+5][100+5];
int step[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,-1},{-1,1},{1,1}};
int n,m;
int fun(int r,int c){
    int count=0;
    int i,j;
    int newr,newc;
    for(i=0;i<8;i++){
        newr=r+step[i][0];
        newc=c+step[i][1];
        if(newr>=0&&newr<n&&newc>=0&&newc<m)//此处容易写错 newx>=0&&newx<m&&newy>=0&&newy<n调了一会 
            if(s[newr][newc]=='*')
                count++;
    }
    return count;
}
int main(){
    int i,j;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        scanf("%s",s[i]);
    for(i=0;i<n;i++)
        for(j=0;j<m;j++){
            if(s[i][j]=='*')
                b[i][j]=-1;//地雷位置设为-1 
            else
                b[i][j]=fun(i,j);
        }
    for(i=0;i<n;i++){
        for(j=0;j<m;j++)
            if(b[i][j]==-1)
                printf("*");
            else
                printf("%d",b[i][j]);
        printf("\n");
    }
    return 0;
}
28.p1055 ISBN号码
难度:入门难度
考点:输入,输出 ,字符串,字符转数字,数字转字符  
适用:小学生
注意:过大的数组要开到main函数的外面。
小技巧:要设置一个计数变量
陷阱:没注意%11,结果可能是0,1,2,3,4,5,6,7,8,9,10 10是两位数,题目太简单了,容易漏看:所得的余数即为识别码,如果余数为10,则识别码为大写字母X

#include <stdio.h>
int main(){
    char s[20];
    int ans;
    scanf("%s",s);
    ans=(s[0]-'0')*1+(s[2]-'0')*2+(s[3]-'0')*3+(s[4]-'0')*4;
    ans+=(s[6]-'0')*5+(s[7]-'0')*6+(s[8]-'0')*7+(s[9]-'0')*8+(s[10]-'0')*9;
    ans%=11;
    if(ans==10)
        if(s[12]=='X')
            printf("Right\n");
        else{
            s[12]='X';
            printf("%s\n",s);
        }
    else if(ans==s[12]-'0')
        printf("Right\n");
    else{
        s[12]=ans+'0';
        printf("%s\n",s);
    }
    return 0;
}
29.p1047 校门外的树
难度:入门难度
考点:输入,输出 ,整数数组操作  
适用:小学生

注意:过大的数组要开到main函数的外面

int a[10000+10]; 
#include <stdio.h>
int main(){
    int L,m;
    int i,j,start,end;
    int remain;
    scanf("%d%d",&L,&m);
    for(i=0;i<=L;i++)
        a[i]=1;
    for(i=0;i<m;i++){
        scanf("%d%d",&start,&end);
        for(j=start;j<=end;j++)
            a[j]=0;
    }
    remain=0;
    for(i=0;i<=L;i++)
        if(a[i]==1)
            remain++;
    printf("%d\n",remain);
    return 0;
}

30.p1422  小玉家的电费
难度:入门难度
考点:输入,输出 ,浮点数计算,if else语句  

适用:小学生

#include <stdio.h>
int main(){
    int a;
    float b;
    scanf("%d",&a);
    if(a<=150)
        b=a*0.4463;
    else if(a>=151&&a<=400)
        b=150*0.4463+(a-150)*0.4663;
    else if(a>400)
        b=150*0.4463+(400-150)*0.4663+(a-400)*0.5663;
    printf("%.1f\n",b);
    return 0;
}
31.p1001 A+B Problem
难度:入门难度
考点:输入,输出 ,整数四则运算  

适用:小学生

#include <stdio.h>
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    printf("%d\n",a+b);
    return 0;
}
32.p1008 三连击
难度:入门难度
考点:输入,输出 ,整数四则运算,深度优先算法  
适用:小学生
#include <stdio.h>
#include <string.h>
int a[10];
int visited[10];
int n=9;
void dfs(int step){
    int b,c,d;
    int i;
    b=a[1]*100+a[2]*10+a[3];
    c=a[4]*100+a[5]*10+a[6];
    d=a[7]*100+a[8]*10+a[9];
    if(step==n+1){
        if(c==2*b&&d==3*b)
            printf("%d %d %d\n",b,c,d);
        return;
    }
    for(i=1;i<=9;i++)
        if(visited[i]==0){
            a[step]=i;
            visited[i]=1;
            dfs(step+1);
            visited[i]=0;
        }
}
int main(){
    memset(visited,0,sizeof(visited));
    dfs(1);
    return 0;
} 
33.p1548 棋盘问题
难度:入门难度
考点:输入,输出 ,整数四则运算,矩阵  
适用:小学生
#include <stdio.h>
int main(){
    int n,m;
    int r1,c1,r2,c2,e1,e2;
    int square=0,rect=0;
    scanf("%d%d",&n,&m);
    for(r1=0;r1<=n;r1++)
        for(c1=0;c1<=m;c1++)
            for(r2=r1+1;r2<=n;r2++)
                for(c2=c1+1;c2<=m;c2++){
                    e1=r2-r1;
                    e2=c2-c1;
                    if(e1>0&&e2>0)
                        if(e1==e2)
                            square++;
                        else
                            rect++;
                }
    printf("%d %d\n",square,rect);            
}
34.p1424 小鱼的航程(改进版)
难度:入门难度
考点:输入,输出 ,取模  
适用:小学生
陷阱:结束时间是n+x-1
#include <stdio.h>
int main(){
    int x,n;
    int i;
    int ans;
    int end;
    scanf("%d%d",&x,&n);
    ans=0;
    end=n+x;
    for(i=x;i<end;i++)
        if(i%7!=0&&i%7!=6)//非双休日
             ans+=250;
    printf("%d\n",ans);
    return 0;
}
35.p1427 小鱼的数字游戏
难度:入门难度
考点:输入,输出 ,一维数组操作  
适用:小学生
#include <stdio.h>
int a[100+10];
int main(){
    int v;
    int count=0;
    int i;
    scanf("%d",&v);
    while(v){
        a[count]=v;
        count++;
        scanf("%d",&v);
    }
    printf("%d",a[count-1]);
    for(i=count-2;i>=0;i--)
        printf(" %d",a[i]);
    printf("\n");
    return 0;
} 
36.p1428 小鱼比可爱
难度:入门难度
考点:输入,输出 ,一维数组操作  
适用:小学生
#include <stdio.h>
#include <string.h>
int a[1000+10];
int b[1000+10];
int main(){
    int n;
    int i,j;
    memset(b,0,sizeof(b));
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n;i++)
        for(j=i+1;j<n;j++)
            if(a[i]<a[j])
                b[j]++;
    printf("%d",b[0]);
    for(i=1;i<n;i++)
        printf(" %d",b[i]);
    printf("\n");
    return 0;
}

37.p1200 你的飞碟在这儿
难度:入门难度
考点:输入,输出 ,字符串操作,字符转数字,取模  
适用:小学生

#include <stdio.h>
#include <string.h>
int main(){
    char hui[10],dui[10];
    int h,d;
    int hlen,dlen;
    int i;
    scanf("%s%s",hui,dui);
    hlen=strlen(hui);
    dlen=strlen(dui);
    h=1;
    d=1;
    for(i=0;i<hlen;i++)
        h*=hui[i]-'A'+1;
    for(i=0;i<dlen;i++)
        d*=dui[i]-'A'+1;
    if(h%47==d%47)
        printf("GO\n");
    else
        printf("STAY\n");
    return 0;
}
38.p1308 统计单词数  
难度:普及-
考点:输入,输出 ,含空格字符串读取  
适用:小学生
注意:过大的数组要开到main函数的外面。
陷阱:题目比较刁钻,第二行提供的字符串,开始部分也可以是空格,真是难以想象啊,测试数据1,8就是。

#include <stdio.h>
#include <string.h>
#include <ctype.h>
char s1[20];
char s2[1000000+10];
int main(){
    int count=0;
    char c;
    int i,j;
    int s1len,s2len;
    int flag;
    int num,k;
    scanf("%s",s1);
    
    //字符串s2读取,比较费力 
    while((c=getchar())!=EOF)
        if(c!='\r'&&c!='\n')
            s2[count++]=c;
    while(!isalpha(s2[count-1]))
        count--;
    s2[count]='\0';
    
    s1len=strlen(s1);
    s2len=strlen(s2);
    
    //s1,s2字符串,转化成小写 
    for(i=0;i<s1len;i++)
        if(isalpha(s1[i])&&s1[i]>='A'&&s1[i]<='Z')
            s1[i]='a'+s1[i]-'A';
    for(i=0;i<s2len;i++)
        if(isalpha(s2[i])&&s2[i]>='A'&&s2[i]<='Z')
            s2[i]='a'+s2[i]-'A';
    
    num=0;
    for(i=0;i<s2len;i++){
        flag=0;
        for(j=0;j<s1len;j++){
            if(s2[i+j]==s1[j])
                flag=1;
            else{
                flag=0;
                break;
            }
        }
        if(flag==1){
            if(s2[i+s1len]==' '||i+s1len==count){//i+s1len==count表示结尾
                if(i==0||s2[i-1]==' '){//开头
                    num++;
                    if(num==1)
                        k=i;
                } 
            } 
        }
    }
    if(num>0)
        printf("%d %d\n",num,k);
    else
        printf("-1\n");
    return 0;
} 
39.//P1664 每日打卡心情好
//模拟样例后,对活跃值奖励作如下解释:
//第几天    该天获得活跃值奖励
//1<=T<=2       1
//3<=T<=6       2
//7<=T<=29      3
//30<=T<=119    4
//120<=T<=364   5
//365<=T        6

//9-12天理解,建议拿出纸笔进行计算
//第9天:1//我回来了,可惜连续天数变成5-4=1天了TQT……获得1点经验,共9点,连续2天
//连续天数 5-2^(3-1)+1=2 +1指的是第9天这天
//第10天:0//啊,事情太多给忘了

//第11天:1//连续天数变成2-1=1天。获得1点经验,共10点,连续2天。
//连续天数 2-2^(1-1)+1=2 +1指的是第11天这天
//第12天:1//获得2点经验,共12点,连续3天。
//连续天数 2+1=3 +1指的是第12天这天。

//得到上述结论,样例大约模拟了3次。

//样例通过后,提交,测试点4,5 WA

//看了讨论,https://www.luogu.org/discuss/show?postid=4548摘抄如下:
//一定不要忽略当连续天数被扣到0以下的情况,确实没考虑到此种情况,马上修改,提交AC 2017-10-1 14:27
//不看谈论,要想到"一定不要忽略当连续天数被扣到0以下的情况"上述问题,估计是很难很难。
#include <stdio.h>
int mypow(int a){//自己编的幂次方的函数,针对该题特有的函数
    int ans=1,i;
    for(i=1;i<=a-1;i++)
        ans*=2;
    return ans;
}
int main(){
    int n,i,b,T=0,ans=0,count=0;//count 连续0天统计  T指的是当前连续天数
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&b);
        if(b){//b==1
            if(count){//有连续0天 天数
                T-=mypow(count);
                if(T<0)//1 //一定不要忽略当连续天数被扣到0以下的情况,确实没考虑到此种情况,漏了改功能,现添加上
                    T=0;
                count=0;
            }
            T++;
            if(1<=T&&T<=2)ans+=1;
            else if(3<=T&&T<=6)ans+=2;
            else if(7<=T&&T<=29)ans+=3;
            else if(30<=T&&T<=119)ans+=4;
            else if(120<=T&&T<=364)ans+=5;
            else if(365<=T)ans+=6;
        }else{//b==0
            count++;
        }
    }
    printf("%d\n",ans);
    return 0;
}

40.//P2911 [USACO08OCT]牛骨头Bovine Bones
#include <stdio.h>
#include <string.h>
int sum[200];
int main(){
    int s1,s2,s3,i,j,k,max=0;
    memset(sum,0,sizeof(sum));
    scanf("%d%d%d",&s1,&s2,&s3);
    for(i=1;i<=s1;i++)
        for(j=1;j<=s2;j++)
            for(k=1;k<=s3;k++)
                sum[i+j+k]++;
    for(i=3;i<=s1+s2+s3;i++)
        if(max<sum[i]){
            max=sum[i];
            j=i;
        }
    printf("%d\n",j);
    return 0;
}

2017-10-1 15:41AC

41.//ybt 1310 【例2.2】车厢重组
//洛谷 P1116 车厢重组
//题目若不标难度,看起来很吓人,排序的算法很多,会造成比较次数不同
//归并排序 需要空间,从题意看提供不了
//该题只给了一个交换空间,基本上属冒泡或快排
//极端情况,快排与冒泡算法复杂度相同
//2017-10-28 9:12 AC
#include <stdio.h>
int a[10100];
int main(){
    int n,i,j,t,cnt=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&a[i]);
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
            if(a[i]>a[j])t=a[i],a[i]=a[j],a[j]=t,cnt++;
    printf("%d",cnt);
    return 0;
}




猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/60465707
今日推荐