Week14 作业 A

题目描述:

每一个大人曾经都是一个小孩,Q老师 也一样。

为了回忆童年,Q老师 和 Monika 玩起了石头剪刀布的游戏,游戏一共 n 轮。无所不知的 Q老师 知道每一轮 Monika 的出招,然而作为限制, Q老师 在这 n 轮游戏中必须恰好出 a 次石头,b 次布和 c 次剪刀。

如果 Q老师 赢了 Monika n/2(上取整) 次,那么 Q老师就赢得了这场游戏,否则 Q老师 就输啦!

Q老师非常想赢,他想知道能否可以赢得这场游戏,如果可以的话,Q老师希望你能告诉他一种可以赢的出招顺序,任意一种都可以。

总结:

这题其实没有什么注意的点,但是有一个关于C++语言的问题,看下方图片

代码:

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int cntM[258];	
int N,A,B,C;
string M;
int realA,realB,realC;
void print()
{
	cout<<"YES"<<endl;
	string s(N,0);
	A-=realA,B-=realB,C-=realC;
	//Ìî³ä
	for(int i=0;i<N;i++)
	{
		if( M[i]=='S' && realA>0 ) s[i]='R',--realA;
		else if( M[i]=='R' && realB>0 ) s[i]='P',--realB;
		else if( M[i]=='P' && realC>0 ) s[i]='S',--realC;
	}
	//Ìî³äÍêÓ®µÄ£¬Ê£ÏµÄËæ±ãÌî³ä
	for(int i=0;i<N;i++)
	{
		if(s[i]==0)
		{
			if(A>0) s[i]='R',--A;
			else if(B>0) s[i]='P',--B;
			else if(C>0) s[i]='S',--C;
		}
	 }
	cout<<s<<endl;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		memset(cntM,0,sizeof(cntM));
		cin>>N>>A>>B>>C>>M;	
		for(auto x:M)
			cntM[x]++; 
		realA=min(A,cntM['S']),
		realB=min(B,cntM['R']),
		realC=min(C,cntM['P']);
		int Limit=(int)ceil((double)N/2.0); 
		int Now=realA+realB+realC;
		if(Now<Limit) cout<<"NO"<<endl;
		else print();
	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/qingoba/p/13111267.html