8.25题目:多少场上王者

前言:

本道题是一位好友提供,小编觉得本道题还是很好滴,便拿来介绍一下咯!

一、题目说明

      蜗蜗国最近很流行一个游戏,名字叫做“蜗蜗荣耀”。在这个游戏里,有排位赛的机制。玩家一开始拥有一个0星账号,如果能够得到50星,那么就意味着他(她)达到了最强的蜗蜗王者级别。
要如何得到星呢?要通过不断胜利来获取。规则如下
       如果连胜一场(比如只赢了一场就是连胜一场),则总共获得一颗星,如果连胜两场、第二场胜利可以获得2颗星,总共获得1+ 2 = 3 颗星 如里连胜三场,则总共获得1 + 2 + 3=6 颗星,如果有一次战败,则连胜状态就结束了。同样,如果连败也是会掉星的丢失星星,如果连败一场,则总共丢掉1颗星,如果连败两场,第二场失败会丢掉2颗星,总共丢掉1+2=3颗星,如果连败三场,则总共丢掉1+2+3=6颗星。但是如果已经没有星星了,也就不会丢失了,只会维持在0星状态。如果有一次获胜,则连败状态就结束了。
      小蜗蜗最近和朋友打赌,自己能够达到蜗蜗王者。他总共打了n场比赛,每场比赛的结果用0和1来表示,0表示败了,1表示胜了,请你帮他算一算,打完以后他是不是蜗蜗王者。如果是的话,请输出yes,如果不是,请你计算出,假设他接下来每一场都是胜利的,那么至少还需要几场才能够达到蜗蜗王者,注意,连胜状态是持续的,例如打过的n场中的倒数第二场是失败而最后一场是胜利,那么额外打的第一场会获得2颗星,因为这是连胜的第二场。

二、题目分析

1、游戏规则

(1)初始状态:玩家拥有一个 0 星账号,目标是达到 50 星成为 “蜗蜗王者”。

(2)连胜规则:

   连胜一场获得一颗星。

   连胜两场,第二场胜利获得 2 颗星,总共获得 1 + 2 = 3 颗星。

   连胜三场,第三场胜利获得 3 颗星,总共获得 1 + 2 + 3 = 6 颗星,以此类推。

   若有一次战败,则连胜状态结束。

(3)连败规则:

   连败一场丢掉一颗星。

   连败两场,第二场失败丢掉 2 颗星,总共丢掉 1 + 2 = 3 颗星。

   连败三场,第三场失败丢掉 3 颗星,总共丢掉 1 + 2 + 3 = 6 颗星,以此类推。

若已经没有星星,不会再丢失,只会维持在 0 星状态。若有一次获胜,则连败状态结束。

2、任务要求

小蜗蜗打了n场比赛,每场比赛结果用 0(败)和 1(胜)表示。需要判断小蜗蜗打完这n场比赛后是否是 “蜗蜗王者”。如果是,输出 “yes”;如果不是,计算出在假设他接下来每场都胜利的情况下,至少还需要几场比赛能够达到 “蜗蜗王者”,且连胜状态是持续的。例如,若小蜗蜗打完n场中的倒数第二场是失败而最后一场是胜利,那么额外打的第一场会获得 2 颗星,因为这是连胜的第二场。

三、解题思路

(1)全局思路:

首先根据输入的比赛结果序列,模拟游戏过程,计算出小蜗蜗当前的星星总数。

然后判断当前星星总数是否达到或超过 50 星,如果是则小蜗蜗已经是 “蜗蜗王者”,输出 “yes”。

如果不是 “蜗蜗王者”,则从当前状态开始假设小蜗蜗接下来每场比赛都胜利,计算还需要连胜多少场才能达到 50 星。

(2)具体实现:

1.创建一个变量n来表示比赛总场次;

2.创建一个数组results用来存储输入的比赛结果;

3.初始化星星总数stars为 0,连胜场数win为 0,连败场数 lose 为 0;

4.通过for循环来遍历比赛结果;

5.for的循环具体实现

如果当前比赛胜利且之前处于连败的情况下:

 lose的值改为0,并且win++;连败终止,连胜次数加1。

如果当前比赛失败且之前处于连胜的情况下:

win的值改为0,并且lose++;连胜终止,连败次数加1。

6.使用if else语句判断是否达到王者段位,如果达到,输出yes,如果没有,计算还需要连胜几场才能达到王者段位。

四、具体代码实现(含注释)

//星星stars ,连胜场次win,连败场次lose,比赛总次数 n
#include 
int main()
{
    // 输入比赛总场次 n
    int n = 10;
    scanf("%d", &n);

    //  存储每场比赛结果
    int results[n] = { 0 };
    for (int i = 0; i < n; i++) 
    {
        scanf("%d", &results[i]);
    }
    int stars = 0;//星星总数
    int win = 0;//连胜场数
    int lose = 0;//连败场数
    // 遍历每场比赛结果
    for (int i = 0; i < n; i++) 
    {
        if (results[i] == 1) 
        {      
            if (lose > 0) // 如果当前比赛胜利且之前处于连败状态
            {
                lose = 0;//结束连败
            }
            win++;//连胜增加   
            stars += win;// 根据连胜场次增加星星总数
        }
        else {
            // 如果当前比赛失败且之前处于连胜状态
            if (win> 0) 
            {
                win = 0;//结束连胜
            }
            lose++;
            // 如果星星总数大于 0,根据连败场次减少星星总数,这是因为如果星星数为0,则失败后不在掉星
            if (stars > 0) 
            {
                stars -= lose;
            }
        }
    }
    if (stars >= 50) 
    {
        // 如果星星总数大于等于 50,输出“yes”
        printf("yes\n");
    }
    else {
        // 额外比赛场次计数
        int extrag= 0;
        // 星星小于50时,不断增加额外比赛场次,同时根据连胜场次增加星星总数
        while (stars < 50) 
        {       
            extrag++;
            stars += extrag;
        }  
        printf("%d\n", extrag);//还需要多少场达到王者
    }
    return 0;
}

注意:

本道题代码使用了变长数组,如果想要代码正常运行,请在支持变长数组的环境下使用。 

 

你可能感兴趣的:(随缘解题,算法,数据结构,c语言,数组)