P7184 [CRCI2008-2009] MAJSTOR 题解
Yizhixiaoyun · · 题解
题目传送门
题目分析
这道题并不难,核心就是一个石头剪刀布的函数。
由于有可能出现平局,所以一个 bool 函数并不能很好地解决问题,再加上我们还可以顺便从函数中计算分数,所以使用 int 函数是更好的选择。
以下为核心代码:
int winlose(char a,char b){
if(a==b) 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; //输
}
接着就是模拟。第一个答案直接按照题意来,而第二个答案就是在每局都判断一下出什么得分最高。
贴上代码
#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(a==b) 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;
}