题目目录:
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 加密的病历单
题目描述
小英是药学专业大三的学生,暑假期间获得了去医院药房实习的机会。
在药房实习期间,小英扎实的专业基础获得了医生的一致好评,得知小英在计算概论中取得过好成绩后,主任又额外交给她一项任务,解密抗战时期被加密过的一些伤员的名单。
经过研究,小英发现了如下加密规律(括号中是一个“原文 → 密文”的例子)
-
原文中所有的字符都在字母表中被循环左移了三个位置(bcd→yza)
-
逆序存储(abcd→dcba)
-
大小写反转(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;
}
这篇博客就到这里啦,我们下篇博客见!