1 条题解

  • 0
    @ 2025-8-24 22:27:25

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Yizhixiaoyun
    AFOed on 2023/10/21

    搬运于2025-08-24 22:27:25,当前版本为作者最后更新于2022-04-17 12:47:20,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门

    题目分析

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

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

    信息

    ID
    5809
    时间
    1000ms
    内存
    32MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者