P7184 [CRCI2008-2009] MAJSTOR 题解

· · 题解

题目传送门

题目分析

这道题并不难,核心就是一个石头剪刀布的函数。

由于有可能出现平局,所以一个 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;
}