[CRCI2008-2009] MAJSTOR
题目背景
剪刀石头布是一种流行的两人游戏。
题目描述
在游戏中,两人都用自己的手出示三个手势之一:石头,布或剪刀。
如果两个玩家出示相同的手势,则该游戏为平局。否则,剪刀胜布,布胜石头,而石头胜剪刀。
Sven 多年来一直在研究游戏的心理错综复杂性,并已成为游戏的真正大师,他的朋友们在一对一的游戏中没有与他抗衡的机会。
随着世界锦标赛的临近,Sven 正在与 n n n 个朋友同时玩游戏,以练习他的技能。
游戏有 r r r 轮,在每一轮中,Sven 和他的每个朋友出三种手势之一。
计分规则:
- Sven 获胜,得 2 2 2 分。
- 平局,得 1 1 1 分。
- 对手获胜,得 0 0 0 分。
编写一个程序来计算 Sven 的总得分,如果他事先知道他的朋友会出的所有手势,那么他最大得分也是可能的。
输入格式
第一行,一个正整数 r r r,表示比赛轮数。
第二行,
r
r
r 个字符,第
i
i
i 个字符表示 Sven 在第
i
i
i 局出的手势,只可能是 S
(剪刀),P
(布),R
(石头)。
第三行,一个正整数 n n n,表示他的朋友数。
接下来
n
n
n 行,每行都有
r
r
r 个字符,第
j
j
j 个字符表示 Sven 的第
i
i
i 个朋友在第
j
j
j 局出的手势,只可能是 S
(剪刀),P
(布),R
(石头)。
输出格式
第一行,输出 Sven 的实际分数。
假设他的朋友没有改变他们的手势,则在第二行输出他最大的得分。
样例 #1
样例输入 #1
5
SSPPR
1
SSPPR
样例输出 #1
5
10
样例 #2
样例输入 #2
5
SSPPR
2
PPRRS
RRSSP
样例输出 #2
10
15
样例 #3
样例输入 #3
4
SPRS
4
RPRP
SRRR
SSPR
PSPS
样例输出 #3
12
21
提示
数据规模及约定
对于 100 % 100\% 100% 的数据, 1 ≤ n , r ≤ 50 1 \le n, r \le 50 1≤n,r≤50。
说明
- 本题满分 50 50 50 分。
- 本题译自 COCI2008-2009 CRCI2008-2009 MAJSTOR,译者 @tearing。
C++实现
#include<bits/stdc++.h>
using namespace std;
int r,n;
int ans1,ans2;
char a[52][1002],s[1002];
int tot[3];
char u[3]={‘R’,‘S’,‘P’};
int winlose(char a,char b){
if(ab) return 1;
else if(a’R’&&b==‘S’) return 2;
else if(a==‘P’&&b==‘R’) return 2;
else if(a==‘S’&&b==‘P’) return 2;
return 0;
}
int main(){
cin>>r;
for(register int i=1;i<=r;++i) cin>>s[i];
cin>>n;
for(register int i=1;i<=n;++i){
for(register int j=1;j<=r;++j){
cin>>a[i][j];
}
}
for(register int i=1;i<=r;++i){
tot[0]=0;tot[1]=0;tot[2]=0;
for(register int j=1;j<=n;++j){
for(register int k=0;k<3;++k) tot[k]+=winlose(u[k],a[j][i]);
ans1+=winlose(s[i],a[j][i]);
}
int q=max(tot[0],tot[1]);
ans2+=max(q,tot[2]);
}
cout<<ans1<<endl<<ans2;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容