在集训的最后一个晚上,淇淇子和水水子都觉得有些无聊,所以他们决定进行n次石头剪刀布。由于水水子是一个预言家,所以水水子已经提前知道了淇淇子在接下来n次对局中的手势。但是,淇淇子是一个巫师,他对水水子发动巫术了,使得水水子在接下来的游戏中只能出a次石头,b次剪刀,c次布(a+b+c=n),但是顺序是不受限制的。
水水子想知道她最多能赢得多少局游戏,聪明的你能帮助她找到答案么?
输入格式:
第一行一个整数t(1<=t<=100)表示测试组数,接下来是t组测试。 每组测试包含三行: 第一行一个正整数n(1<=n<=100)表示对局数 第二行包含三个整数a, b, c(0<=a, b, c<=n),保证a+b+c=n 第三行是长度为n的字符串,只包含'R', 'S', 'P',分别表示石头、剪刀、布,表示淇淇子接下来n局的手势。
输出格式:
输出t行,每组测试一行: 对于每组测试,输出一个整数表示水水子最多能赢得多少局
限制:
空间限制:128MByte 时间限制:1秒
样例:
输入: 2 3 1 1 1 RPS 3 3 0 0 RPS
输出: 3 1
提示:
在第一组测试中,水水子可以出PSR来打败琪琪子3次
在这题的描述之中,我们可以知道,剪刀可以赢布,布可以赢石头,石头可以赢剪刀,这样我们就直接求剪刀与石头的最小值······总之,求出两者之间的最小值就行了,因为谁能赢多少就是谁的步数最少,我们要的是水水子的赢的数量,所以两者剪刀石头布的最小值就行
AC代码:
#include<bits/stdc++.h>
using namespace std;
char RSP[1000];
int R2,S2,P2,cnt;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);//优化输入输出
int T;
cin>>T;
for(int a=1;a<=T;a++){
int n,R1,S1,P1;
cin>>n>>R1>>S1>>P1;
string str;
cin>>str;
for(int i=0;i<n;i++){
RSP[i+1]=str[i];
}
for(int i=1;i<=n;i++){
if(RSP[i]=='R'){
R2++;
}else if(RSP[i]=='S'){
S2++;
}else if(RSP[i]=='P'){
P2++;
}
}//统计淇淇子的剪刀石头布的数量
cnt+=min(R1,S2);//求石头与剪刀的最小值
cnt+=min(S1,P2);//求布与剪刀的最小值
cnt+=min(P1,R2);//求石头与布的最小值
cout<<cnt<<"\n";
cnt=0;//归零!!很重要!!
R1=0; R2=0;
S1=0; S2=0;
P1=0; P2=0;
}
return 0;
}
大家一起加油!