算法竞赛入门经典 第三章习题题解

写在前面

我的第八篇博客,小白书第三章:数组和字符串,习题.
题目在uva上,用了一个不是很稳的vpn,计时做题.

1. Score (Uva 1585) 模拟

T组数据,每组80个字符’O’或’X’,输出每组的得分.得分定义为若’O’是连续的第k个’O’,记k分.

#include <cstdio>
#include <cstring>
char s[100];
int main(void)
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        int tmp=0,ans=0;
        for(int i=0;i<strlen(s);i++)
        {
            if(s[i]=='X')
                tmp=0;
            else
            {
                tmp++;
                ans+=tmp;
            }
        }
        printf("%d\n",ans );
    }
    return 0;
}

AC时间 5分钟.

2. Uva 1586 - Molar mass (模拟)

输入t组只有CHON的分子式,求分子量.数字不超过99.

#include <bits/stdc++.h>
char s[200];
int main(void)
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",s);
        double now=0.0,ans=0.0;
        int ti1=0,ti2=0;
        for(int i=0;i<strlen(s);i++)
        {
            if(isalpha(s[i]))
            {
                if(ti1==0&&ti2==0) ti2=1;
                ans+=now*(ti1*10+ti2);
                ti1=ti2=0;
                switch(s[i])
                {
                    case 'C':now=12.01;break;
                    case 'H':now=1.008;break;
                    case 'O':now=16.00;break;
                    case 'N':now=14.01;break;
                }
            }
            else if(ti2==0)
            {
                ti2=s[i]-'0';
            }
            else
            {
                ti1=ti2;
                ti2=s[i]-'0';
            }
        }
        if(ti1==0&&ti2==0) ti2=1;
        ans+=now*(ti1*10+ti2);
        printf("%.3f\n",ans );
    }
    return 0;
}

AC时间:13分钟.感觉逻辑有点混乱了.

3. Uva 1225 - Digit Counting

t组数据,每组给出一个10000以内的正整数n,输出从1数到n的过程中每个数字(0-9)出现了几次.

#include <bits/stdc++.h>
int main(void)
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a[10]={},n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int tmp=i;
            while(tmp)
            {
                a[tmp%10]++;
                tmp/=10;
            }
        }
        for(int i=0;i<=8;i++)
            printf("%d ",a[i] );
        printf("%d\n",a[9] );
    }
    return 0;
}

AC时间6分钟,uva很看重格式,多一个空格也会PE.

4. uva 455 - Periodic Strings 周期串

t组数据,每组读入一个字符串(80)求其最小周期.
枚举即可.

8月31日修改:使用了新做的板子,简洁明了

#include <bits/stdc++.h>
char s[10000];
template <typename T>int cycle(T *s, int n)
{
    int xx = n / 2 + 1;
    for(int ans = 1; ans <= xx; ans++)
    {
        if(n % ans) continue;
        for(int x = ans; x < n; x += ans)
            for(int i = 0; i < ans; i++)
                if(s[x + i] != s[i])
                    goto pp;
        return ans;
        pp:;
    }
    return n;
}
int main(void)
{
    int t;
    scanf("%d", &t);
    for(int k = 0; k < t; k++)
    {
        scanf("%s", s);
        int ans=cycle(s,strlen(s));
        if(k != 0)
            printf("\n");
        printf("%d\n", ans );
    }
    return 0;
}

5. uva 227 - Puzzle 模拟

t组数据,每组输入5x5的字符,其中有一个空格.然后一连串操作后接一个数字0表示操作结尾,输出操作的执行结果.最后是一个Z表示结束.

#include <bits/stdc++.h>
using namespace std;
char save[6][6],op[20000];
int pp[2][4]={{-1,1,0,0},{0,0,-1,1}};
int main(void)
{
    for(int idx=1;idx<=20000;idx++)
    {
        int flag=1,keyx,keyy;
        for(int i=0;i<5;i++)
        {
            int j=-1;
            do
            {
                j++;
                save[i][j]=getchar();
                if(save[0][0]=='Z')
                    return 0;
                if(save[i][j]==' ')
                    keyx=i,keyy=j;
            }
            while(save[i][j]!='\n');
            if(j==4)
            {
                save[i][4]=' ';
                keyx=i,keyy=4;
            }
        }
        if(idx!=1)  printf("\n");
        char op;
        while(1)
        {
            op=getchar();
            if(op=='\n')    continue;
            if(op=='0') break;
            int ps=0;
            switch(op)
            {
                case 'A':ps=0;break;
                case 'B':ps=1;break;
                case 'L':ps=2;break;
                case 'R':ps=3;break;
            }
            int nex=keyx+pp[0][ps],ney=keyy+pp[1][ps];
            if(flag==1&&nex>=0&&nex<=4&&ney>=0&&ney<=4)
            {
                swap(save[keyx][keyy],save[nex][ney]);
                keyx=nex,keyy=ney;
            }
            else
                flag=0;
        }
        getchar();
        printf("Puzzle #%d:\n",idx );
        if(flag)        
            for(int i=0;i<5;i++)
            {
                for(int j=0;j<4;j++)
                    printf("%c ",save[i][j]);
                printf("%c\n",save[i][4]);
            }
        else
            printf("This puzzle has no final configuration.\n");
    }
    return 0;
}

代码用时,一个小时.各种改bug

睡觉,明天起来继续.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值