洛谷 3道题 题解

题目目录:

No.1 B2112 石头剪子布

No.2 B2114 配对碱基链 

No.3 B2116 加密的病历单

OK,开始正文!

第一题:B2112 石头剪子布

题目描述

石头剪子布,是一种猜拳游戏。起源于中国,然后传到日本、朝鲜等地,随着亚欧贸易的不断发展它传到了欧洲,到了近现代逐渐风靡世界。简单明了的规则,使得石头剪子布没有任何规则漏洞可钻,单次玩法比拼运气,多回合玩法比拼心理博弈,使得石头剪子布这个古老的游戏同时用于“意外”与“技术”两种特性,深受世界人民喜爱。

游戏规则:石头打剪刀,布包石头,剪刀剪布。

现在,需要你写一个程序来判断石头剪子布游戏的结果。

输入格式

第一行是一个整数 N,表示一共进行了 N 次游戏。1≤N≤100。

接下来 N 行的每一行包括两个字符串,表示游戏参与者 Player1,Player2 的选择(石头、剪子或者是布): S1,S2

字符串之间以空格隔开 S1 S2 只可能取值在 Rock,Scissors,Paper (大小写敏感)中。

输出格式

输出包括 N 行,每一行对应一个胜利者(Player1 或者 Player2),或者游戏出现平局,则输出 Tie

输入输出样例

输入 #1

3
Rock Scissors
Paper Paper
Rock Paper

输出 #1

Player1
Tie
Player2

思路:

有些人(我)一看到题目,小脑就萎缩了,可以用switch?于是就用了......全部写完喜提CE......在这里提醒大家:switch只能用于整型(不包含超长整型)变量和字符(没有字符串!)变量

正确思路:就是直接if判断(注意到Rock,Scissors,Paper和Player1,Player2,Tie一直要在代码里重复出现,不妨把它们放到字符串数组里面,可以减少代码量)

AC代码:

#include<bits/stdc++.h>
using namespace std;
string a[4]={"","Rock","Scissors","Paper"};
string name[4]={"","Player1","Player2","Tie"};
signed main()
{
    int n;
    cin >> n;
    while(n--)
    {
        string s1,s2;
        cin >> s1 >> s2;
        if(s1==a[1])
        {
            if(s2==a[1])
            {
                cout<<name[3];
            }
            else if(s2==a[2])
            {
                cout<<name[1];
            }
            else
            {
                cout<<name[2];
            }
        }
        if(s1==a[2])
        {
            if(s2==a[2])
            {
                cout<<name[3];
            }
            else if(s2==a[3])
            {
                cout<<name[1];
            }
            else
            {
                cout<<name[2];
            }
        }
        if(s1==a[3])
        {
            if(s2==a[3])
            {
                cout<<name[3];
            }
            else if(s2==a[1])
            {
                cout<<name[1];
            }
            else
            {
                cout<<name[2];
            }
        }
        cout<<"\n";
    }
    return 0;
}

第二题:B2114 配对碱基链

题目描述

脱氧核糖核酸(DNA)由两条互补的碱基链以双螺旋的方式结合而成。

而构成 DNA 的碱基共有 4 种:

  • 分别为腺嘌呤(A)

  • 鸟嘌呤(G)

  • 胸腺嘧啶(T)

  • 胞嘧啶(C)

我们知道,在两条互补碱基链的对应位置上,腺嘌呤总是和胸腺嘧啶配对,鸟嘌呤总是和胞嘧啶配对。

你的任务就是根据一条单链上的碱基序列,给出对应的互补链上的碱基序列。

输入格式

一个字符串,表示一条碱基链。

这个字符串只含有大写字母 A 、 T 、 G 、 C,分别表示腺嘌呤、胸腺嘧啶、鸟嘌呤和胞嘧啶。

字符串长度不超过 255。

输出格式

一个只含有大写字母 A 、 T 、 G 、 C 的字符串,为与输入的碱基链互补的碱基链。

输入输出样例

输入 #1

ATATGGATGGTGTTTGGCTCTG

输出 #1

TATACCTACCACAAACCGAGAC

思路:

好简单,输入,然后遍历,遍历过程中直接输出(或者替换,最后输出,两种代码都有,两种其实差不多,一个输出一个替换)

AC代码:

AC代码1(直接输):
#include<bits/stdc++.h>
using namespace std;
signed main()
{
    string s;
    cin >> s;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='A')
        {
            cout<<"T";
        }
        else if(s[i]=='T')
        {
            cout<<"A";
        }
        else if(s[i]=='G')
        {
            cout<<"C";
        }
        else
        {
            cout<<"G";
        }
    }
    return 0;
}
AC代码2(替换):
#include<bits/stdc++.h>
using namespace std;
signed main()
{
    string s;
    cin >> s;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='A')
        {
            s[i]='T';
        }
        else if(s[i]=='T')
        {
            s[i]='A';
        }
        else if(s[i]=='G')
        {
            s[i]='C';
        }
        else
        {
           s[i]='G';
        }
    }
    cout<<s;
    return 0;
}

第三题:B2116 加密的病历单

题目描述

小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。

在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。

经过研究,小英发现了如下加密规律(括号中是一个“原文 → 密文”的例子)

  1. 原文中所有的字符都在字母表中被循环左移了三个位置(bcd→yza)

  2. 逆序存储(abcd→dcba)

  3. 大小写反转(abXY→ABxy)

现在给出一个加密的字符串,请你将其解密

输入格式

一个加密的字符串。(长度小于 50 且只包含大小写字母)

输出格式

输出解密后的字符串。

输入输出样例

输入 #1

GSOOWFASOq

输出 #1

Trvdizrrvj

思路:

先遍历字符串,小写转大写,大写转小写,然后用reverse把字符串倒过来,最后右移(xyz要特判,这里用到了第一题没用成的switch)

AC代码:

#include<bits/stdc++.h>
using namespace std;
signed main()
{
    string s;
    cin >> s;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]>='a'&&s[i]<='z')
        {
            s[i]-=32;
        }
        else if(s[i]>='A'&&s[i]<='Z')
        {
            s[i]+=32;
        }
    }
    reverse(s.begin(),s.end());
    for(int i=0;i<s.size();i++)
    {
        switch(s[i])
        {
            case 'x':
            cout<<"a";
            break;
            case 'y':
            cout<<"b";
            break;
            case 'z':
            cout<<"c";
            break;
            case 'X':
            cout<<"A";
            break;
            case 'Y':
            cout<<"B";
            break;
            case 'Z':
            cout<<"C";
            break;
            default:
            cout<<char(s[i]+3);
            break;
        }
    }
    return 0;
}

这篇博客就到这里啦,我们下篇博客见!

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值