Game Rank Gym-101550G

Game Rank Gym-101550G


题目链接

题意及做法

(1)初始版本

#include <stdio.h>
#include <string.h>

int
main() {
    int rak, star, i, len, t;
    char s[10005];

    while( scanf("%s", s) != EOF ) {
        // 输入连续的字符串,getchar()可不用
        getchar();
        //puts(s);
        len = strlen(s);
        rak = 25;  // 当前等级
        star = 0;  // 当前星星
        t = 0;  // 连赢
        for( i = 0; i < len; i++ ) {
            if( rak < 1 ) {  // legend后,输赢不影响
                break;
            }
            if( s[i] == 'W' ) {  // 赢一局
                star++;
                t++;
                if( rak >= 6 && rak <= 25 && t >= 3) {  // 额外的奖励
                    star++;
                }
                if( rak >= 21 && rak <= 25 && star > 2 ) {
                    rak--;
                    star -= 2;
                }
                else if( rak >= 16 && rak <= 20 && star > 3 ) {
                    rak--;
                    star -= 3;
                }
                else if( rak >= 11 && rak <= 15 && star > 4 ) {
                    rak--;
                    star -= 4;
                }
                else if( rak >= 1 && rak <= 10 && star > 5 ) {
                    rak--;
                    star -= 5;
                }
            }
            else if( s[i] == 'L' ) {  // 输一局
                t = 0;  // 连赢=0
                if( rak >= 1 && rak <= 20 ) {  // 掉星
                    star--;
                    if( star < 0 ) {  // 会掉级
                        if( rak == 20 ) {  // 20级不会掉级
                            star = 0;
                        }
                        else if( rak >= 15 && rak < 20 ) {  // 边界,15掉级会掉到下一个等级区间
                            rak++;
                            star = 2;  // 满星减一
                        }
                        else if( rak >= 10 && rak < 15 ) {
                            rak++;
                            star = 3;
                        }
                        else if( rak >= 1 && rak < 10 ) {
                            rak++;
                            star = 4;
                        }
                    }
                }
            }
        }
        if( rak < 1 ) {
            printf("Legend\n");
        }
        else {
            printf("%d\n", rak);
        }
    }

    return 0;
}

(2)函数的写法

#include <stdio.h>
#include <string.h>

char s[10005];
int Rank, Star;

void
up(int v){
    Star += v;
    if( Rank >= 21 && Rank <= 25 && Star > 2 ) {
        Rank--;
        Star -= 2;
    }
    else if( Rank >= 16 && Rank <= 20 && Star > 3) {
        Rank--;
        Star -= 3;
    }
    else if( Rank >= 11 && Rank <= 15 && Star > 4 ) {
        Rank--;
        Star -= 4;
    }
    else if( Rank >= 1 && Rank <= 10 && Star > 5 ) {
        Rank--;
        Star -= 5;
    }
}

void
down(){
    if( Rank > 20 ) {
        return ;
    }
    if(Star) {
        Star--;
        return ;
    }
    if(Rank < 20) {
        Rank++;
        if( Rank >= 16 && Rank <= 20 ) {
            Star = 2;
        }
        else if( Rank >= 11 && Rank <= 15 ) {
            Star = 3;
        }
        else if( Rank >= 1 && Rank <= 10 ) {
            Star = 4;
        }
    }
}

int
main(){
    int n, num, i;

    while( ~scanf("%s", s) ) {
        n = strlen(s);
        Rank = 25;
        Star = 0;
        num = 0;
        for( i = 0; i < n; i++ ) {
            if( Rank == 0 ) {
                break;
            }
            if( s[i] == 'L' ) {
                down();
                num = 0;
            }
            else if( s[i] == 'W' ) {
                num++;
                if( Rank >= 6 && num >= 3 ) {
                    up(2);
                }
                else {
                    up(1);
                }
            }
        }
        if( Rank != 0 ) {
            printf("%d\n",Rank);
        }
        else {
            printf("Legend\n");
        }
    }

    return 0;
}

(3)反省
(1)满星减一,开始一直以为是满星,论学习英语的重要性。

(2)Legend的输出位置,开始直接在for()里面输出,结果在for()后面会再次输出一个0,
当时脑子可能被狗叼走了,这题一直卡到比赛最后没做出来,其实发现了边界和减一这两个坑后,思路是完全正确的。
不能丢了教训,以后注意细节方面/逻辑严密。

(3)学习大佬处理输一局的思路,掉级的话,先掉级,根据掉级后的等级,再处理星星;
而不是根据当前等级,掉级+处理星星,前者不需要处理边界,可以省少许时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值