20190101算法竞赛入门经典第一部分语言篇

第三章 上机练习
习题3-1 分数统计stat
习题3-1 得分(UVa1585 Score)

#include
#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

#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

#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; 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值