1. 程式人生 > >《演算法競賽入門經典(第二版)》第三章 習題(1-5)

《演算法競賽入門經典(第二版)》第三章 習題(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; 
}