B - Rock-Paper-Scissors Gym - 100712B

题意: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;
}

猜你喜欢

转载自blog.csdn.net/eric_chen_song_lin/article/details/81172589