洛谷练题记录

数组

1、小鱼比可爱(7.24)

#include <stdio.h>
int main(int argc, char *argv[])
{
    int n;
    int a[100]={0},b[100]={0};
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    for(int i=n-1;i>=1;i--)
    {
        for(int j=i-1;j>=0;j--)
        {
            if(a[i]>a[j])
                b[i]++;
        }
    }
    for(int i= 0;i<n;i++)
        printf("%d ",b[i]);
    return 0;
} 

2、小鱼的数字游戏

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[100]={0},n=0;
    do
    {
        scanf("%d",&a[n]);
        n++;
    }
    while(a[n-1]!=0);
    for(int i=n-2;i>=0;i--)
    {
        printf("%d ",a[i]);
    }

    return 0;
}

3、冰雹猜想

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i,a[1000]={0};
    scanf("%d",&a[0]);
    for(i=1;a[i-1]!=1;i++)
    {
        if(a[i-1]%2==0)
            a[i]=a[i-1]/2;
        else
            a[i]=a[i-1]*3+1;
    }
    for(i=i-1;i>=0;i--)
        printf("%d ",a[i]);
    return 0;
}

我原来的开的数组a[100]太小了,后面改成a[1000]。

4、校门外的树(7.25)

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[10001]={0};
    int l,m,u,v,num=0;
    scanf("%d %d",&l,&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d %d",&u,&v);
        for(int j=u;j<=v;j++)
            a[j]=1;
    }
    for(int i=0;i<=l;i++)
    {
        if(a[i]==0)
            num++;
    }
    printf("%d\n",num);

    

    return 0;
} 

最开始对于题的数学思维很好理解,但用代码很难表示出来,后面查找资料学会数组标记法,其中第一遍踩坑,这个范围是[0,l},而题目要求是[0,l],所以在设置数组大小是不能是10000,而是10001。

5、旗鼓相当的对手

 

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int a[1000][4]={0};
    int N,n,count=0,flag=0;
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%d %d %d",&a[i][0],&a[i][1],&a[i][2]);
        a[i][3]=a[i][0]+a[i][1]+a[i][2];
    }
    for(int i=0;i<N;i++)
    {
        for(int j=i+1;j<N;j++)
        {
            if(abs(a[i][0]-a[j][0])<=5 &&
                    abs(a[i][1]-a[j][1])<=5 &&
                    abs(a[i][2]-a[j][2])<=5 &&
                    abs(a[i][3]-a[j][3])<=10)
                count++;
        }
    }
    printf("%d\n",count);
    return 0;
}

注意:abs()函数不是在<math.h>,而是在<stdlib.h>头文件中

6、彩票摇奖

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[7]={0};
    int b[7]={0};
    int c[7]={0};
    int n,count;
    scanf("%d",&n);
    for(int i=0;i<7;i++)
        scanf("%d",&a[i]);
    for(int i=0;i<n;i++)
    {
        count=0;
        for(int j=0;j<7;j++)
        {
            scanf("%d",&b[j]);
            for(int k=0;k<7;k++)
            {
                if(a[k]==b[j])
                    count++;
            }
        }
        c[count-1]++;
    }
    for(int i=6;i>=0;i--)
        printf("%d ",c[i]);

    return 0;
}

7、神奇的幻方

#include <stdio.h>

int main(int argc, char *argv[])
{
    int n,h,l;
    int a[40][40]={0};
    scanf("%d",&n);
    for(int i=1;i<=n*n;i++)
    {
        if(i==1)
        {
            h=1;
            l=(n+1)/2;
        }
        else
            if(h==1 &&(l!=n))
            {
                h=n;
                l=l+1;
            }
            else if((h!=1)&&l==n)
            {
                h=h-1;
                l=1;
            }
            else if(h==1&&l==n)
            {
                h=h+1;
            }
            else if(h!=1&&l!=n)
            {
                if(a[h-1][l+1]==0)
                {
                    h=h-1;
                    l=l+1;
                }
                else
                {
                    h=h+1;
                }
            }
        a[h][l]=i;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            printf("%d ",a[i][j]);
        puts("");
    }
    return 0;
} 

8、梦中统计

#include <stdio.h>

int main(int argc, char *argv[])
{
    int m,n;
    int a[10]={0};
    scanf("%d %d",&m,&n);
    for(int i=m;i<=n;i++)
    {
        int t=i;
        while(t>0)
        {
            a[t%10]++;
            t=t/10;
        }
    }
    for(int i=0;i<10;i++)
        printf("%d ",a[i]);

    return 0;
} 

9、珠心算测验

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[100]={0},b[100]={0};
    int n,count=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(int i=0;i<n-1;i++)
        for(int j=i+1;j<n;j++)
            for(int k=0;k<n;k++)
            {
                if(a[i]+a[j]==a[k])
                {
                    b[k]=1;
                    break;
                }
            }
    for(int i=0;i<n;i++)
    {
        if(b[i]==1)
            count++;
    }
    printf("%d\n",count);
    return 0;
} 

注意:最初只考虑 a[i]+a[j]==a[k]为真,就加1,但是1+4=5与2+3=5都是一类的,后面加b数组来表示a数据的状态,0没有两个数相加等于,1则是有。

10、爱与愁的心动(7.26)

#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int n,m,min=100000000000;
    int a[3000]={0};
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(int i=0;i<=n-m;i++)
    {
        int sum=0;
        for(int j=i;j<i+m;j++)
        {
            sum+=a[j];
        }
        if(sum<min)
            min=sum;
    }
    printf("%d\n",min);
    return 0;
} 

注意:最开始一直设置min值设置过小,改完后一直卡80分,后面将  i<n-m  改为  i<=n-m  成功AC。

11、Bovine Bones G

#include <stdio.h>

int main(int argc, char *argv[])
{
    int s1,s2,s3;
    int max=0,num;
    int a[100]={0};
    scanf("%d %d %d",&s1,&s2,&s3);
    for(int i=1;i<=s1;i++)
        for(int j=1;j<=s2;j++)
            for(int k=1;k<=s3;k++)
               a[i+j+k]++;
    for(int i=3;a[i]>0;i++)
        if(max<a[i])
        {
            max=a[i];
            num=i;
        }
    printf("%d\n",num);
    return 0;
} 

12、开灯

#include <stdio.h>
#define Max 2000001
int main(int argc, char *argv[])
{
    int t,n;
    int b[Max]={0};
    double a;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%lf %d",&a,&t);
        for(int j=1;j<=t;j++)
        {
            if(b[(int)(j*a)]==1)
                b[(int)(j*a)]=0;
            else
                b[(int)(j*a)]=1;
        }
    }
    for(int i=0;i<Max;i++)
        if(b[i]==1)
        {
            printf("%d",i);
            break;
        }
    return 0;
} 

注意:最开始定义a为float数据类型,后面AC只有60分,看大佬帮人解释可能是精度崩了,又改成了double。

13、蛇形矩阵

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[15][15]={0};
    int i=1,n,h=1,l=0;
    scanf("%d",&n);
    while(i<=n*n)
    {
        while(l<n&&!a[h][l+1]) a[h][++l]=i++;
        while(h<n&&!a[h+1][l]) a[++h][l]=i++;
        while(l>1&&!a[h][l-1]) a[h][--l]=i++;
        while(h>1&&!a[h-1][l]) a[--h][l]=i++;
    }
    for(int j=1;j<=n;j++)
    {
        for(int k=1;k<=n;k++)
            printf("%3d",a[j][k]);
        puts("");
    }

    return 0;
} 

注意:

14、杨辉三角

#include <stdio.h>

int main(int argc, char *argv[])
{
    int n,a[21][21]={0};
    scanf("%d",&n);
    a[1][1]=1;
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
            a[i][j]=a[i-1][j]+a[i-1][j-1];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
            printf("%d ",a[i][j]);
        puts("");
    }


    return 0;
}

15、插火把

#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int a[110][110]={0};
    int n,m,k,x,y,num;
    scanf("%d %d %d",&n,&m,&k);
    for(int i=0;i<m;i++)
    {
        scanf("%d %d",&x,&y);
        int h=x+2,l=y+2;
        for(int j=h-2;j<=h+2;j++)
            a[j][l]=1;
        for(int j=l-2;j<=l+2;j++)
            a[h][j]=1;
        a[h-1][l-1]=1;
        a[h-1][l+1]=1;
        a[h+1][l-1]=1;
        a[h+1][l+1]=1;
    }
    for(int i=0;i<k;i++)
    {
        scanf("%d %d",&x,&y);
        int h=x+2,l=y+2;
        for(int j=h-2;j<=h+2;j++)
            for(int k=j-2;k<=j+2;k++)
                a[j][k]=1;
    }
    for(int i=3;i<n+3;i++)
        for(int j=3;j<n+3;j++)
            if(a[i][j]==0)
                num++;
    printf("%d\n",num);
    return 0;
} 

目前只有60分,后续还要改动

16、压缩技术(7.27)

#include <stdio.h>

int main(int argc, char *argv[])
{
    int a[210][210]={0};
    int n,j,i=0,x,num=0,sum=0;
    scanf("%d",&n);
    for(i=0;i<n*n;)
    {
        scanf("%d",&x);
        num++;
        sum+=x;
        while(i<sum)
        {
            if(num%2==1)
                a[i/n][i%n]=0;
            else
                a[i/n][i%n]=1;
            i++;
        }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            printf("%d",a[i][j]);
        puts("");
    }
    return 0;
} 

字符串

1、自动修正(7.29)

#include <stdio.h>

int main(int argc, char *argv[])
{
    char a[100]={0};
    int i=0;
    gets(a);
    while(a[i]!='\0')
    {
        if(a[i]>='a'&&a[i]<='z')
            a[i]=a[i]-32;
        i++;
    }
    puts(a);
    return 0;
} 

2、凯撒密码

#include <stdio.h>

int main(int argc, char *argv[])
{
    char a[50]={0};
    int n,i=0;
    scanf("%d%s",&n,a);
    while(a[i]!='\0')
    {
        if(a[i]+n<='z'&&a[i]+n>='a')
            a[i]+=n;
        else
            a[i]=a[i]-26+n;
        i++;
    }
    puts(a);
    return 0;
}

注意:原来是直接为a[i]+=n;会出现a[i]>128,超过了ASCII码,所以要修改判断。

3、笨小猴

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char a[100]={0};
    int b[26]={0};
    int i=0,max=0,min=101;
    int cha;
    gets(a);
    for(i=0;i<strlen(a);i++)
    {
        int num=0;
        for(int j=0;j<strlen(a);j++)
            if(a[i]==a[j])
                num++;
        if(min>num)
            min=num;
        if(max<num)
            max=num;
    }
    cha=max-min;
    for(i=2;i<=cha;i++)
        if(cha%i==0)
            break;
    if(i==cha)
    {
        printf("Lucky Word\n");
        printf("%d\n",cha);
    }
    else
    {
        printf("No Answer\n");
        printf("0\n");
    }

    return 0;
}

4、口算练习题(优化)

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char a[50];
    char b[50][50],t[50];
    char p;
    int n,j,num1,num2;
    int s=0;
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++)
    {
        gets(a);
        num1=0;
        num2=0;
        s=0;
        if(a[0]>='a'&&a[0]<='c')
        {
            switch(a[0])
            {
                case 'a':p='+';break;
                case 'b':p='-';break;
                case 'c':p='*';break;
            }
            strcpy(b[i],&a[2]);
        }
        else
            strcpy(b[i],&a[0]);
        for(j=0;j<strlen(b[i]);j++)
        {
            if(b[i][j]==' ')
            {
                num1=s;
                s=0;
                b[i][j]=p;
            }
            else
            {
                int t=b[i][j]-'0';
                s=s*10+t;
            }
        }
        num2=s;
        switch(p)
        {
            case '+':s=num1+num2;break;
            case '-':s=num1-num2;break;
            case '*':s=num1*num2;break;
        }
        sprintf(t,"%d",s);
        strcat(b[i],"=");
        strcat(b[i],t);
    }
    for(int i=0;i<n;i++)
    {
        puts(b[i]);
        printf("%ld\n",strlen(b[i]));
    }
    return 0;
}

注意:使用了  sprintf( )函数和strcat( )函数;

sprintf( )函数:

        sprintf(char a[],"%d",int b);

        将int数据类型转换成字符串存入数组a[ ]中

strcat( )函数:

        strcat(字符串a,字符串b);

        将字符串b的内容追加到字符串a中;

目前感觉这道题的思路还是很混乱,有机会重写。

5、标题统计

#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int num=0;
    char a[100];
    gets(a);
    for(int i=0;a[i];i++)
    {
        if(a[i]>='a'&&a[i]<='z')
            num++;
        else if(a[i]>='A'&&a[i]<='Z')
            num++;
        else if(a[i]>='0'&&a[i]<='9')
            num++;
    }
    printf("%d\n",num);
    return 0;
}

6、统计单词数(7.30)---40'

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    char a[11];
    char b[1000000];
    int i=0,av=100000000,num=0;
    gets(a);
    gets(b);
    for(i=0;b[i];i++)
    {
        if(b[i]>='A'&&b[i]<='Z')
            b[i]+=32;
    }
    for(i=0;a[i];i++)
    {
        if(a[i]>='A'&&a[i]<='Z')
            a[i]+=32;
        if(a[i]==' ')
        {
            for(int j=i;j<strlen(a)-1;j++)
            {
                a[j]=a[j+1];
            }
            i--;
        }
    }
    for(i=0;b[i];i++)
    {
        if(a[0]==b[i])
        {
            int k=i;
            int j=0;
            while(a[j]||b[k])
            {
                if(a[j]==b[k])
                {
                    j++;
                    k++;
                }
                else
                    break;
            }
            if(j==strlen(a))
            {
                if(av>i)
                    av=i;
                num++;
            }
        }
    }
    if(num>0)
        printf("%d %d\n",num,av);
    else
        printf("-1\n");
    return 0;
} 

注意:字符串能力不够,多练习

7、手机

#include <stdio.h>

int main(int argc, char *argv[])
{ 
    char str[201];
    gets(str);
    char *p=str;
    int num=0;
    while(*p)
    {
        if(*p==' '||*p=='a'||*p=='d'||*p=='g'||*p=='j'||*p=='m'||*p=='p'||*p=='t'||*p=='w')
            num+=1;
        else if(*p=='b'||*p=='e'||*p=='h'||*p=='k'||*p=='n'||*p=='q'||*p=='u'||*p=='x')
            num+=2;     
        else if(*p=='c'||*p=='f'||*p=='i'||*p=='l'||*p=='o'||*p=='r'||*p=='v'||*p=='y')
            num+=3;
        else
            num+=4;
        p++;
    }
    printf("%d\n",num);
    return 0;
} 

8、小果的键盘

#include <stdio.h>

int main(int argc, char *argv[])
{
    char a[101]={0};
    int n,num=0,flag=0;
    scanf("%d%s",&n,a);
    for(int i=0;i<n-1;i++)
    {
        if(a[i]=='V'&&a[i+1]=='K')
        {
            num++;
            a[i]='0';
            a[i+1]='1';
        }
    }
    for(int i=0;i<n-1;i++)
    {
        if(a[i]==a[i+1])
        {
            num++;
            break;
        }
    }
    printf("%d\n",num);
    return 0;
} 

9、单词覆盖还原

#include <stdio.h>
int main(int argc, char *argv[])
{ 
    int b=0,g=0;
    char a[260]={0};
    gets(a);
    for(int i=0;a[i];i++)
    {
        if(a[i]=='b'||a[i+1]=='o'||a[i+2]=='y')
            b++;     
        if(a[i]=='g'||a[i+1]=='i'||a[i+2]=='r'||a[i+3]=='l')
            g++;
    }
    printf("%d\n",b);
    printf("%d\n",g);
    return 0;
}

注意:代码不难,但是思路难想

10、你的飞碟在这儿

#include <stdio.h>

int main(int argc, char *argv[])
{
    char a[10]={0},b[10]={0};
    gets(a);
    gets(b);
    char *p=a,*q=b;
    int z=1,h=1;
    while(*p)
    {
        int t=*p-'A'+1;
        h*=t;
        p++;
    }
    while(*q)
    {
        int t=*q-'A'+1;
        z*=t;
        q++;
    }
    if(h%47==z%47)
        printf("GO\n");
    else
        printf("STAY\n");

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值