暑假提高4--G - Game Rank(模拟)

题目好长,放链接吧  http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2018

【分析】

  1. 题目读了好久才懂,就是有不同的等级,满星后升级并加星
  2. 玩家赢得比赛,他会获得一个星 在6 - 25级之间连续三连胜以上,他可以获得一个额外的星星,当前的星超过了当前等级的限制的时候就会上升一个等级 
  3. 输了一场比赛,他就失去了一颗星,如果玩家在当前排名是零星,失去一颗星后,那么他将失去一个等级,然后得到在下面的排名中满星减去一个的数量的星。 
  4. 二十级0星的时候输不会掉星星。 
  5. 如果达到了Legend等级的时候就再输都不会掉级了。 
  6. 这题是Special Judge。有一个比较坑的点就是那个连胜的判断是在该盘加星之前的。(参考:https://blog.csdn.net/yyy_3y/article/details/78461491
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
char s[10005];
int main(){
    int rank[30] = {5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,3,3,3,3,3,2,2,2,2,2,0,0,0,0};
    while (~scanf("%s",s))
    {
        int l=strlen(s);
        int r=25,cnt=0;
        for (int i=0;i<l;i++)
        {
            if (s[i]=='W')
            {
                cnt++;
                if (i>1&&s[i-1]=='W'&&s[i-2]=='W'&&r>=6)
                    cnt++;
                if (cnt>rank[r])
                {
                    cnt-=rank[r];
                    r--;
                }
            }
            else if(s[i]=='L')
            {
                if (r>20||r==20&&cnt==0)//大于20级的输了不扣分 
                    continue;
                cnt--;
                if (cnt < 0)
                {
                    r++;
                    cnt = rank[r] - 1;
                }
            }
            if (r == 0)
                break;
          //  cout<<"r="<<r<<",cnt="<<cnt<<endl;
        }
        if (r)
            cout<<r<<endl;
        else
            cout<<"Legend"<<endl;
    }
    return 0;

}

猜你喜欢

转载自blog.csdn.net/qq_38735931/article/details/81541827