《算法竞赛入门经典(第二版)》第三章 习题(1-5)

习题3-1 得分(UVa1585 Score)

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
 
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        char s[100]={0};
        scanf("%s",s);
        int n=strlen(s),count=0,sum=0;
        for(int i=0;i<n;i++){
            if(s[i]=='X')count=0;
            else{count++;sum+=count;}
        }
        printf("%d\n",sum);
    }
    
    return 0;
}

 

习题3-2 分子量(UVa1586 Molar Mass)

#include<iostream>

#include<stdio.h>

#include<string.h>

using namespace std;

 

double mass(char ch){

    switch(ch){

        case 'C':return 12.01;

        case 'H':return 1.008;

        case 'O':return 16.00;

        case 'N':return 14.01;

    }

}

int main(){

    const int maxn=1000;

    int T;

    scanf("%d",&T);

    while(T--){

        char s[maxn]={0};

        scanf("%s",&s);

        int n=strlen(s),tmp2=1,first=1;

        double sum=0,tmp1=0;

        for(int i=0;i<n;i++){

            if(s[i]=='C' || s[i]=='H' || s[i]=='O' || s[i]=='N'){

                first=1;

                sum+=tmp1*tmp2;

                tmp1=mass(s[i]);

                tmp2=1;

            }

            else{

                if(first){tmp2=s[i]-'0';first=0;}

                else tmp2=tmp2*10+s[i]-'0';

            }

        }

        sum+=tmp1*tmp2;

        printf("%.3lf\n",sum);

    }

    return 0;

}

 

 

 

 

 
习题3-3 数数字(UVa1225 Digit Counting) 

#include<stdio.h>
#include<string.h>
using namespace std;

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        long long a[10]={0};
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            int tmp=i;
            while(tmp>0){ a[tmp%10]++; tmp/=10; }
        }
        for(int i=0;i<=9;i++)
            printf("%d%c",a[i],i==9?'\n':' ');
    }
    return 0;
}

 
习题3-4 周期串(UVa455 Periodic Strings) 

#include<iostream>

#include<string.h>

#include<stdio.h>

using namespace std;

 

int main(){

    const int maxn=85;

    int T,second=0;

    scanf("%d",&T);

    while(T--){

        char s[100]={0};

        scanf("%s",s);

        int n=strlen(s);

        for(int i=1;i<=n;i++){

            if(n%i)    continue;

            int a=n/i,flag=0;

            char tmp1[maxn+5]={0};

            memcpy(tmp1,s,i);

            for(int j=1;j<a;j++){//j个周期

                char tmp2[maxn+5]={0};

                memcpy(tmp2,&s[i*j],i);

                if(strcmp(tmp1,tmp2)){flag=1;break;}

            }

            if(flag)

                continue;

            else{

                printf("%d\n",i);

                if(T)printf("\n");

                break;

            }

        }

    }

    return 0;

}

 
 
习题 3-5 谜题(UVa227 Puzzle) 

注意:这道题的输入输出都比较坑:

输入是带空白符的字符串,需要用scanf("%c")读入,并结合getchar()读走行末回车;也可以直接用gets()一排一排的读入。

输出也挺坑:要求行末无空格、文末无空行,但文末要有换行符,而且相邻两组数据间用空行隔开……非常烦人。

#include<string.h>
#include<stdio.h>
using namespace std;

int main(){
    const int maxn=5;
    int count=1,firsttmp=1;
    while(true){
        char map[maxn+1][maxn+1]={0};
        int x=0,y=0;
        for(int i=0;i<maxn;i++){
            for(int j=0;j<maxn;j++){
                scanf("%c",&map[i][j]);
                if(map[0][0]=='Z')return 0;    
            }
            getchar();
        } 
        for(int i=0;i<maxn;i++)
            for(int j=0;j<maxn;j++){
                if(map[i][j]==' ')
                    {x=i;y=j;}
            }
        char s[1000]={0};
        int flag=0,n=0;
        for(n=0;;n++){
            scanf("%c",&s[n]);
            if(s[n]=='0')break;
        }
        getchar();
        if(firsttmp)firsttmp=0;
        else    printf("\n");    
        printf("Puzzle #%d:\n",count++);
        for(int i=0;i<n;i++){
            if(flag)continue;
            switch(s[i]){
                case'A':    if(x-1>=0)    { map[x][y]=map[x-1][y]; map[x-1][y]=' '; x--; }
                            else { printf("This puzzle has no final configuration.\n"); flag=1; }
                            break;
                case'B':    if(x+1<maxn){ map[x][y]=map[x+1][y]; map[x+1][y]=' '; x++; }
                            else { printf("This puzzle has no final configuration.\n"); flag=1; }
                            break;
                case'L':    if(y-1>=0)    { map[x][y]=map[x][y-1]; map[x][y-1]=' '; y--; }
                            else { printf("This puzzle has no final configuration.\n"); flag=1; }
                            break;
                case'R':    if(y+1<maxn){ map[x][y]=map[x][y+1]; map[x][y+1]=' '; y++; }
                            else { printf("This puzzle has no final configuration.\n"); flag=1; }
                            break;
            }
        }
        if(!flag){
            int first=1;
            for(int i=0;i<maxn;i++)
                for(int j=0;j<maxn;j++)
                    printf("%c%c",map[i][j],j+1<maxn?' ':'\n');
            
        }
    }
    return 0; 
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值