信息学奥赛一本通(C++版) 第一部分 C++语言 第五章 数 组

信息学奥赛一本通(C++版) 第一部分 C++语言 第五章 数 组

http://ybt.ssoier.cn:8088/

第一节 一维数组

//1102 与指定数字相同的数的个数
#include <stdio.h>
int a[110];
int main(){
    int n,i,b,cnt=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&b);
    for(i=1;i<=n;i++)
        if(a[i]==b)cnt++;
    printf("%d",cnt);
    return 0;
}

//1103 陶陶摘苹果
#include <stdio.h>
int a[20];
int main(){
    int i,b,cnt=0;
    for(i=1;i<=10;i++)
        scanf("%d",&a[i]);
    scanf("%d",&b);
    for(i=1;i<=10;i++)
        if(b+30>=a[i])
            cnt++;
    printf("%d",cnt);
    return 0;
}

//1104 计算书费
#include <stdio.h>
int main(){
    double a[]={0,28.9,32.7,45.6,78,35,86.2,27.8,43,56,65},sum=0;
    int b;
    int i;
    for(i=1;i<=10;i++){
        scanf("%d",&b);
        sum+=b*a[i];
    }
    printf("%.1lf",sum);
    return 0;
}

//1105 数组逆序重存放
#include <stdio.h>
int a[110];
int main(){
    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=n;i>=1;i--)
        printf("%d ",a[i]);
    return 0;
}

//1106 年龄与疾病
#include <stdio.h>
int main(){
    int n,i,a,cnt1=0,cnt2=0,cnt3=0,cnt4=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        if(0<=a&&a<=18)cnt1++;
        else if(19<=a&&a<=35)cnt2++;
        else if(36<=a&&a<=60)cnt3++;
        else if(61<=a)cnt4++;
    }
    printf("%.2lf%%\n%.2lf%%\n%.2lf%%\n%.2lf%%",cnt1*1.0*100/n,cnt2*1.0*100/n,cnt3*1.0*100/n,cnt4*1.0*100/n);
    return 0;
}

//1107 校门外的树
#include <stdio.h>
#include <string.h>
int a[10100];
int main(){
    int L,M,i,left,right,j,cnt=0;
    memset(a,0,sizeof(a));
    scanf("%d%d",&L,&M);
    for(i=1;i<=M;i++){
        scanf("%d%d",&left,&right);
        for(j=left;j<=right;j++)
            a[j]=1;
    }
    for(i=0;i<=L;i++)
        if(a[i]==0)cnt++;
    printf("%d",cnt);
    return 0;
}

//1108 向量点积计算
#include <stdio.h>
int a[1010];
int main(){
    int n,i,b,sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(i=1;i<=n;i++){
        scanf("%d",&b);
        sum+=a[i]*b;
    }
    printf("%d",sum);
    return 0;
}

//1109 开关灯
//猜测容易超时,不过5000*5000=25*10^6不容易超时
#include <stdio.h>
#include <string.h>
int a[5010];
int main(){
    int n,m,i,j,k;
    memset(a,0,sizeof(a));
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        k=1;
        while(k*i<=n){
            a[k*i]=!a[k*i];
            k++;
        }
    }
    k=0;
    for(i=1;i<=n;i++)
        if(a[i]==1){
            k++;
            if(k==1)printf("%d",i);
            else printf(",%d",i);
        }
    return 0;
}

//1110 查找特定的值
#include <stdio.h>
int a[10100];
int main(){
    int n,x,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    scanf("%d",&x);
    for(i=1;i<=n;i++)
        if(x==a[i])
            break;
    if(i==n+1)printf("-1");
    else printf("%d",i);
    return 0;
}

//1111 不高兴的津津
#include <stdio.h>
int main(){
    int a,b,max=0,i,k;
    for(i=1;i<=7;i++){
        scanf("%d%d",&a,&b);
        if(a+b>max){
            max=a+b;
            k=i;
        }
    }
    if(max<=8)printf("0");
    else printf("%d",k);
    return 0;
}

//1112 最大值和最小值的差
#include <stdio.h>
int main(){
    int n,i,min=99999,max=-99999,a;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a);
        if(a<min)min=a;
        if(a>max)max=a;
    }
    printf("%d",max-min);
    return 0;
}

//1113 不与最大数相同的数字之和
#include <stdio.h>
int a[110];
int main(){
    int n,i,max=-9999999,sum=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]>max)max=a[i];
    }
    for(i=1;i<=n;i++)
        if(a[i]!=max)
            sum+=a[i];
    printf("%d",sum);
    return 0;
}

//1114 白细胞计数
//提交,未通过,一查,变量写错了,修改,提交AC
#include <stdio.h>
double a[310];
int main(){
    int n,i,j,k;
    double min=999999,max=-999999,sum=0,avr,delta;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%lf",&a[i]);
        if(a[i]<min)min=a[i],j=i;
        if(a[i]>max)max=a[i],k=i;
    }
    for(i=1;i<=n;i++)
        if(i==j||i==k)sum+=0;
        else sum+=a[i];
    avr=sum/(n-2);
    max=-999999;
    for(i=1;i<=n;i++)
        if(i==j||i==k)continue;
        else{
            if(a[i]>=avr)delta=a[i]-avr;
            else delta=avr-a[i];
            if(delta>max)max=delta;
        }
    printf("%.2lf %.2lf",avr,max);//此处写成 printf("%.2lf %.2lf",avr,delta);
    return 0;
}

//1115 直方图
#include <stdio.h>
#include <string.h>
int a[10100],b[10100];
int main(){
    int max=-999,n,i;
    memset(b,0,sizeof(b));
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]>max)max=a[i];
        b[a[i]]++;
    }
    for(i=0;i<=max;i++)
        printf("%d\n",b[i]);
    return 0;
}

//1116 最长平台
#include <stdio.h>
int main(){
    int n,i,a,b,cnt=1,max=-999999;
    scanf("%d",&n);
    scanf("%d",&a);
    for(i=2;i<=n;i++){
        scanf("%d",&b);
        if(a==b){
            cnt++;
            if(cnt>max)max=cnt;
        }else{
            a=b;
            cnt=1;
        }
    }
    printf("%d",max);
    return 0;
}

//1117 整数去重
#include <stdio.h>
#include <string.h>
int a[20100],vis[20100];
int main(){
    int n,i,j;
    memset(vis,0,sizeof(vis));
    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(vis[i]==0&&a[i]==a[j])
                vis[j]=1;
    for(i=1;i<=n;i++)
        if(vis[i]==0)
            printf("%d ",a[i]);
    return 0;
}

以下代码为优化过代码

//1117 整数去重
#include <stdio.h>
#include <string.h>
int a[20100];
int main(){
    int n,i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        for(j=1;j<i;j++)
            if(a[j]==a[i]){
                i--;
                n--;
            }
    }
    for(i=1;i<=n;i++)
        printf("%d ",a[i]);
    return 0;
}

以下代码为进一步优化代码

//1117 整数去重
#include <stdio.h>
#include <string.h>
int a[20100],vis[20100];
int main(){
    int n,i,j;
    memset(vis,0,sizeof(vis));
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(vis[a[i]]==0){
            printf("%d ",a[i]);
            vis[a[i]]=1;
        }
    }
    return 0;
}

//1118 铺地毯
//https://www.luogu.org/problemnew/show/P1003可见该题
//样例通过,提交AC 2018-4-20
#include <stdio.h>
#define maxn 10100
int a[maxn],b[maxn],g[maxn],k[maxn];
int main(){
    int n,i,x,y;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d%d%d%d",&a[i],&b[i],&g[i],&k[i]);
    scanf("%d%d",&x,&y);
    for(i=n;i>=1;i--)//逆序查找,自最上层地毯开始,逐层查找
        if(a[i]<=x&&x<=a[i]+g[i]&&b[i]<=y&&y<=b[i]+k[i]){
            printf("%d",i);
            return 0;
        }
    printf("-1");
    return 0;
}


//1118 铺地毯
//网站最大的问题出来了,无法显示题目的图片。
//题目不全,没有数据范围
//该题目建议参考https://www.luogu.org/problem/show?pid=1003
#include <stdio.h>
int a[100100],b[100100],g[100100],k[100100];
int main(){
    int n,i,x,y;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        scanf("%d%d%d%d",&a[i],&b[i],&g[i],&k[i]);
    scanf("%d%d",&x,&y);
    for(i=n;i>=1;i--)
        if(a[i]<=x&&x<=a[i]+g[i]&&b[i]<=y&&y<=b[i]+k[i])
            break;
    if(i==0)printf("-1");
    else printf("%d",i);
    return 0;
}

2017-10-22 22:57 AC 该节内容

第二节 二维数组

//1119 矩阵交换行
#include <stdio.h>
int a[10][10];
int main(){
    int i,j,m,n,t;
    for(i=1;i<=5;i++)
        for(j=1;j<=5;j++)
            scanf("%d",&a[i][j]);
    scanf("%d%d",&m,&n);
    for(j=1;j<=5;j++){
        t=a[m][j];
        a[m][j]=a[n][j];
        a[n][j]=t;
    }
    for(i=1;i<=5;i++){
        for(j=1;j<=5;j++)
            printf("%d ",a[i][j]);
        printf("\n");
    }
    return 0;
}

//1120 同行列对角线的格
//提交,未通过,资格创设了一组输入输出数据,找打了错误所在
//输入:
//3 3 3
//输出:
//(3,1) (3,2) (3,3)
//(1,3) (2,3) (3,3)
//(1,1) (2,3) (3,3)
//(3,3)
//该题难点在于边界的处理
//修改,提交AC
#include <stdio.h>
int main(){
    int n,r,c,i,j,a,b;
    scanf("%d%d%d",&n,&r,&c);
    for(j=1;j<=n;j++)
        printf("(%d,%d) ",r,j);
    printf("\n");
    for(i=1;i<=n;i++)
        printf("(%d,%d) ",i,c);
    printf("\n");
    a=r,b=c;
    while(1<a&&1<b)a--,b--;//此处写成 while(1<a&&a<n&&1<b&&b<n)a--,b--;
    while(1<=a&&a<=n&&1<=b&&b<=n){
        printf("(%d,%d) ",a,b);
        a++,b++;
    }
    printf("\n");
    a=r,b=c;
    while(a<n&&1<b)a++,b--;//此处写成  while(1<a&&a<n&&1<b&&b<n)a++,b--;
    while(1<=a&&a<=n&&1<=b&&b<=n){
        printf("(%d,%d) ",a,b);
        a--,b++;
    }
    return 0;
}

//1121 计算矩阵边缘元素之和
#include <stdio.h>
int a[110][110];
int main(){
    int m,n,i,j,sum=0;
    scanf("%d%d",&m,&n);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
    for(j=1;j<=n;j++)
        sum+=a[1][j]+a[m][j];
    for(i=2;i<=m-1;i++)
        sum+=a[i][1]+a[i][n];
    printf("%d",sum);
    return 0;
}

//1122 计算鞍点
#include <stdio.h>
int a[10][10],r[10],c[10];//r[]一行最大值 c[]一列最大值
int main(){
    int i,j,max,min,find=0;
    for(i=1;i<=5;i++)
        for(j=1;j<=5;j++)
            scanf("%d",&a[i][j]);
    for(i=1;i<=5;i++){//行的最大值
        r[i]=-999999999;
        for(j=1;j<=5;j++)
            if(r[i]<a[i][j])r[i]=a[i][j];
    }
    for(j=1;j<=5;j++){//列的最小值
        c[j]=999999999;
        for(i=1;i<=5;i++)
            if(c[j]>a[i][j])c[j]=a[i][j];
    }
    for(i=1;i<=5;i++)
        for(j=1;j<=5;j++)
            if(a[i][j]==r[i]&&a[i][j]==c[j])find=1,printf("%d %d %d\n",i,j,a[i][j]);
    if(find==0)
        printf("not found");
    return 0;
}

//1123 图像相似度
#include <stdio.h>
int a[110][110],b[110][110];
int main(){
    int m,n,i,j,cnt=0;
    scanf("%d%d",&m,&n);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&b[i][j]);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            if(a[i][j]==b[i][j])
                cnt++;
    printf("%.2lf",cnt*1.0*100/(m*n));
    return 0;
}

//1124 矩阵加法
#include <stdio.h>
int a[110][110],b[110][110];
int main(){
    int n,m,i,j;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&b[i][j]);
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++)
            printf("%d ",a[i][j]+b[i][j]);
        printf("\n");
    }
    return 0;
}

//1125 矩阵乘法
#include <stdio.h>
#include <string.h>
int a[110][110],b[110][110],c[110][110];
int main(){
    int n,m,k,i,j,p;
    memset(c,0,sizeof(c));
    scanf("%d%d%d",&n,&m,&k);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    for(i=1;i<=m;i++)
        for(j=1;j<=k;j++)
            scanf("%d",&b[i][j]);
    for(i=1;i<=n;i++)
        for(j=1;j<=k;j++)
            for(p=1;p<=m;p++)
                c[i][j]+=a[i][p]*b[p][j];
    for(i=1;i<=n;i++){
        for(j=1;j<=k;j++)
            printf("%d ",c[i][j]);
        printf("\n");
    }
    return 0;
}

//1126 矩阵转置
//行变列,列变行
#include <stdio.h>
int a[110][110],b[110][110];
int main(){
    int m,n,i,j;
    scanf("%d%d",&m,&n);
    for(i=1;i<=m;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&a[i][j]);
    for(j=1;j<=n;j++)
        for(i=1;i<=m;i++)
            b[j][i]=a[i][j];
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++)
            printf("%d ",b[i][j]);
        printf("\n");
    }
    return 0;
}

//1127 图像旋转
//对两个矩阵表上行列,找规律
#include <stdio.h>
int a[110][110],b[110][110];
int main(){
    int n,m,i,j;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    for(j=1;j<=m;j++)
        for(i=1;i<=n;i++)
            b[j][i]=a[n-i+1][j];
    for(i=1;i<=m;i++){
        for(j=1;j<=n;j++)
            printf("%d ",b[i][j]);
        printf("\n");
    }
    return 0;
}

//1128 图像模糊处理
//在想 2.中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
//拿样例算了一遍,明白了,中间的值全是用旧值算的,不用管新的值
//题目 此句 有误,m行,每行n个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。
//应改成 n行 每行m个整数
//提交,未通过,不敢相信,
//重读题目,发现 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
//(舍入到最接近的整数)是关键 8.7==>9  8.3==>8 即四舍五入
//修改,提交AC
#include <stdio.h>
int a[110][110],b[110][110];
int main(){
    int n,m,i,j;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            b[i][j]=a[i][j];
        }
    for(i=2;i<=n-1;i++)
        for(j=2;j<=m-1;j++)
            b[i][j]=(int)(1.0*(a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1]+a[i][j])/5+0.5);//此处写成b[i][j]=(a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1]+a[i][j])/5;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++)
            printf("%d ",b[i][j]);
        printf("\n");
    }
    return 0;
}

2017-10-23 21:10 AC该节内容

第三节 字符类型和字符数组

//1129 统计数字字符个数
#include <stdio.h>
int main(){
    int cnt=0;
    char c;
    while((c=getchar())!=EOF){
        if('0'<=c&&c<='9')cnt++;
    }
    printf("%d",cnt);
    return 0;
}

//1130 找第一个只出现一次的字符
#include <stdio.h>
#include <string.h>
int a[300];
char s[100100];
int main(){
    int i,len;
    memset(a,0,sizeof(a));
    scanf("%s",s);
    len=strlen(s);
    for(i=0;i<len;i++)
        a[s[i]]++;
    for(i=0;i<len;i++)
        if(a[s[i]]==1){//此处写成 if(a[s[i]]==0) 查了会
            printf("%c",s[i]);
            break;
        }
    if(i==len)printf("no");
    return 0;
}

//1131 基因相关性
//提交,未通过,令人担心的浮点数比较又来了。
//重新读题,发现是代码写错了
//修改,提交AC
#include <stdio.h>
#include <string.h>
int main(){
    double a;
    char b[510],c[510];
    int len,i,cnt=0;
    scanf("%lf%s%s",&a,b,c);
    len=strlen(b);
    for(i=0;i<len;i++)
        if(b[i]==c[i])cnt++;
    if(1.0*cnt/len>=a)printf("yes");//此处写成 if(1.0*cnt/len>=0.85)printf("yes");
    else printf("no");
    return 0;
}

//1132 石头剪子布
#include <stdio.h>
#include <string.h>
char a[20],b[20];
int win(char a[],char b[]){
    if(strcmp(a,"Rock")==0&&strcmp(b,"Scissors")==0)return 1;
    if(strcmp(b,"Rock")==0&&strcmp(a,"Scissors")==0)return 2;
    if(strcmp(a,"Rock")==0&&strcmp(b,"Paper")==0)return 2;
    if(strcmp(b,"Rock")==0&&strcmp(a,"Paper")==0)return 1;
    if(strcmp(a,"Scissors")==0&&strcmp(b,"Paper")==0)return 1;
    if(strcmp(b,"Scissors")==0&&strcmp(a,"Paper")==0)return 2;
}
int main(){
    int n,i;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%s%s",a,b);
        if(strcmp(a,b)==0)
            printf("Tie\n");
        else{
            if(win(a,b)==1)printf("Player1\n");
            else printf("Player2\n");
        }
    }
    return 0;
}

//1133 输出亲朋字符串
#include <stdio.h>
#include <string.h>
char a[110],b[110];
int main(){
    int i,len;
    scanf("%s",a);
    len=strlen(a);
    for(i=0;i<len-1;i++)
        b[i]=a[i]+a[i+1];
    b[len-1]=a[len-1]+a[0];
    b[len]='\0';
    printf("%s",b);
    return 0;
}

//1134 合法C标识符查
#include <stdio.h>
#include <string.h>
char s[30];
int main(){
    int i,len;
    scanf("%s",s);
    if('0'<=s[0]&&s[0]<='9'){
        printf("no");
        return 0;
    }
    len=strlen(s);
    for(i=0;i<len;i++)
        if(('0'<=s[i]&&s[i]<='9')||('a'<=s[i]&&s[i]<='z')||('A'<=s[i]&&s[i]<='Z')||s[i]=='_')
            continue;
        else{
            printf("no");
            return 0;
        }
    printf("yes");
    return 0;
}

//1135 配对碱基链
#include <stdio.h>
#include <string.h>
char a[300],b[300];
char match(char c){
    if(c=='A')return 'T';
    if(c=='T')return 'A';
    if(c=='G')return 'C';
    if(c=='C')return 'G';
}
int main(){
    int i,len;
    scanf("%s",a);
    len=strlen(a);
    for(i=0;i<len;i++)
        b[i]=match(a[i]);
    b[i]='\0';
    printf("%s",b);
    return 0;
}

//1136 密码翻译
//提交,未通过,仔细读题,发现题意:把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,其他非字母字符不变,则可得到一个简单的加密字符串。
//马上修改,提交AC
#include <stdio.h>
int main(){
    char c;
    while((c=getchar())!=EOF){
        if(c=='z')
            printf("a");
        else if(c=='Z')
            printf("A");
        else if(('a'<=c&&c<='y')||('A'<=c&&c<='Y'))
            printf("%c",c+1);
        else
            printf("%c",c);
    }
    return 0;
}

//1137 加密的病历单
//顺序加密,逆序解密
#include <stdio.h>
#include <string.h>
char a[100],b[100];
int main(){
    int i,len;
    scanf("%s",a);
    len=strlen(a);
    for(i=0;i<len;i++)//大小写反转
        if('a'<=a[i]&&a[i]<='z')a[i]=a[i]-'a'+'A';
        else a[i]=a[i]-'A'+'a';
    for(i=0;i<len;i++)//逆序存储
        b[i]=a[len-1-i];
    b[i]='\0';
    for(i=0;i<len;i++)//循环右移3位
        if('a'<=b[i]&&b[i]<='z')b[i]=(b[i]-'a'+3)%26+'a';
        else b[i]=(b[i]-'A'+3)%26+'A';
    printf("%s",b);
    return 0;
}

//1138 将字符串中的小写字母转换成大写字母
#include <stdio.h>
int main(){
    char c;
    while((c=getchar())!=EOF){
        if('a'<=c&&c<='z')printf("%c",c-'a'+'A');
        else printf("%c",c);    
    }
    return 0;
}

//1139 整理药名
#include <stdio.h>
#include <string.h>
char a[30];
int main(){
    int n,i,len,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%s",a);
        len=strlen(a);
        if('a'<=a[0]&&a[0]<='z')//首字母
            a[0]=a[0]-'a'+'A';
        for(j=1;j<len;j++)
            if('A'<=a[j]&&a[j]<='Z')
                a[j]=a[j]-'A'+'a';
        printf("%s\n",a);
    }
    return 0;
}

//1140 验证子串
#include <stdio.h>
#include <string.h>
char a[210],b[210];
int main(){
    int i,j,len1,len2,cnt;
    scanf("%s%s",a,b);
    len1=strlen(a),len2=strlen(b);
    if(len1<=len2){
        for(i=0;i<len2;i++){
            cnt=0;
            for(j=0;j<len1;j++)
                if(i+j<len2&&b[i+j]==a[j]){
                    cnt++;
                    if(cnt==len1){
                        printf("%s is substring of %s",a,b);
                        return 0;
                    }
                }
        }
    }else{
        for(i=0;i<len1;i++){
            cnt=0;
            for(j=0;j<len2;j++)
                if(i+j<len1&&a[i+j]==b[j]){
                    cnt++;
                    if(cnt==len2){
                        printf("%s is substring of %s",b,a);
                        return 0;
                    }
                }
        }
    }
    printf("No substring");
    return 0;
}

//1141 删除单词后缀
#include <stdio.h>
#include <string.h>
char a[40];
int main(){
    int i,len;
    scanf("%s",a);
    len=strlen(a);
    if(a[len-1-1]=='e'&&a[len-1]=='r')a[len-1-1]='\0';
    else if(a[len-1-1]=='l'&&a[len-1]=='y')a[len-1-1]='\0';
    else if(a[len-1-2]=='i'&&a[len-1-1]=='n'&&a[len-1]=='g')a[len-1-2]='\0';
    printf("%s",a);
    return 0;
}

//1142 单词的长度
#include <stdio.h>
#include <string.h>
char a[1010];
int main(){
    int len,k=0;
    while(scanf("%s",a)!=EOF){
        len=strlen(a);
        if(k)printf(",");
        printf("%d",len);
        k++;
    }
    return 0;
}

//1143 最长最短单词
//提交未通过,修改,提交,未通过,看了他人做法,发现单词开头,结尾也可能有其他分割符,本人只考虑了结尾有分隔符,果断修改代码
//多次修改,提交,未通过,冷静一下
//重读题目,发现 单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。
//可能遇到如句子:
//abc,def ghi,lmn
//程序需重头写过,重新编码
//此题折腾了比较长时间,提交AC
#include <stdio.h>
#include <string.h>
char a[30000],b[110],f[110],d[110];//f[]存最短字符串 d[]存最长字符串
int main(){
    int len,k=0,min=999,max=-1,mini,maxi,i=0,len2;//此处写成 int len,k=0,min=-1,max=999,mini,maxi; 有失水准,调了很长时间
    char c;
    while((c=getchar())!='\n')//此处写成while((c=getchar())!=EOF)//字符读取
        a[i++]=c;
    a[i]='\0',len=i;
    i=0;
    while(i<len){//单词解析
        k=0;
        while(i<len&&(a[i]==' '||a[i]==','))i++;
        while(i<len&&(a[i]!=' '&&a[i]!=','))b[k++]=a[i++];//此处写成 b[k++]=a[i];
        b[k]='\0',len2=strlen(b);
        if(len2>0&&len2<min){
            min=len2;
            strcpy(f,b);
        }
        if(len2>0&&len2>max){
            max=len2;
            strcpy(d,b);
        }
    }    
    printf("%s\n%s",d,f);
    return 0;
}


//1144 单词翻转
//请注意题意 输入一个句子(一行)
//提交,未通过,将 //while((c=getchar())!=EOF)改成 while((c=getchar())!='\n')
//明白了 一行 的含义,即是有回车换行。
#include <stdio.h>
#include <string.h>
char a[510];
int main(){
    char c;
    int k=0,len,i=0,cnt,j;
    while((c=getchar())!='\n')//while((c=getchar())!=EOF)
        a[k++]=c;
    a[k]='\0';
    len=strlen(a);
    while(i<len){
        cnt=0;
        while(i<len&&a[i]==' ')i++;
        while(i+cnt<len&&a[i+cnt]!=' ')cnt++;
        for(j=0;j<cnt/2;j++){
            c=a[i+j],a[i+j]=a[i+cnt-1-j],a[i+cnt-1-j]=c;
        }
        i+=cnt;
    }
    printf("%s",a);
    return 0;
}



//1145 字符串p型编码
#include <stdio.h>
#include <string.h>
char a[1100];
int main(){
    int i=0,len,cnt;
    scanf("%s",a);
    len=strlen(a);
    while(i<len){
        cnt=0;
        while(i+cnt<len&&a[i]==a[i+cnt])cnt++;
        printf("%d%d",cnt,a[i]-'0');
        i+=cnt;
    }
    return 0;
}


//1146 判断字符串是否为回文
#include <stdio.h>
#include <string.h>
char a[110];
int main(){
    int i,len;
    scanf("%s",a);
    len=strlen(a);
    for(i=0;i<len/2;i++)
        if(a[i]==a[len-1-i])continue;
        else{
            printf("no");
            return 0;
        }
    printf("yes");
    return 0;
}

//1147 最高分数的学生姓名
#include <stdio.h>
struct node{
    int score;
    char name[30];
}stu[110];
int main(){
    int n,i,k,max=-1;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d%s",&stu[i].score,stu[i].name);
        if(stu[i].score>max)k=i,max=stu[i].score;
    }
    printf("%s",stu[k].name);
    return 0;
}


//1148 连续出现的字符
//可能包括各种字符
//提交,未通过,研读题目,第一个连续出现至少k次的字符。
//明白,漏看了连续二字。
//修改,提交,未通过
//再读题目,发现 否则输出No。竟然没看到这句
//修改,提交AC
#include <stdio.h>
#include <string.h>
char b[1100];
int main(){
    int k,i=0,len,cnt;
    scanf("%d%s",&k,b);
    len=strlen(b);
    while(i<len){
        cnt=0;
        while(i+cnt<len&&b[i+cnt]==b[i])cnt++;
        if(cnt>=k){
            printf("%c",b[i]);
            break;
        }
        i+=cnt;
    }
    if(cnt<k)//漏了该判断
        printf("No");
    return 0;
}


//1149 最长单词2
#include <stdio.h>
#include <string.h>
char a[510],b[510];
int main(){
    int len,max=-1;
    while(scanf("%s",a)!=EOF){
        len=strlen(a);
        if(a[len-1]=='.')a[len-1]='\0',len=strlen(a);
        if(len>max)max=len,strcpy(b,a);
    }
    printf("%s",b);
    return 0;
}

2017-10-24 21:30 AC该节内容

2017-10-24 21:30 AC该章节内容

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/78309848