题意:Bahosain和Bayashout玩石头 剪刀 布的游戏,已知Bayashout在N轮中的出手,而Bahosain在N轮中会先出X个石头,Y个布,Z个剪刀,X + Y + Z = N且X,Y,Z可以为0。N轮中每赢一轮可以加一分,最后积分多的赢。问有多少种出法可以让Bahosain在总共的N轮中获胜。
题解:先预处理Bayashout前 i 轮中的石头,剪刀和布的个数。再二重循环枚举(石头,剪刀的边界)和(剪刀,布的边界),对于每一个i,j计算出他赢的场次和输的场次,如果赢的场次输的场次多,则这种方法可行。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
int t,n,r[1010],p[1010],s[1010],ans;
char str[1010];
scanf("%d",&t);
while(t--)
{
int win,lose;
ans = 0;
memset(r,0,sizeof(r));
memset(p,0,sizeof(p));
memset(s,0,sizeof(s));
scanf("%d",&n);
scanf("%s",str + 1);
for(int i = 1;i <= n;i++)
{
r[i] = r[i - 1];
s[i] = s[i - 1];
p[i] = p[i - 1];
if(str[i] == 'R') r[i]++;
if(str[i] == 'P') p[i]++;
if(str[i] == 'S') s[i]++;
}
for(int i = 0;i <= n;i++)
{
for(int j = i;j <= n;j++)
{
win = s[i] + r[j] - r[i] + p[n] - p[j];
lose = p[i] + s[j] - s[i] + r[n] - r[j];
if(win > lose)
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}