前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8.25题目:多少场上王者

8.25题目:多少场上王者

作者头像
LonlyMay
发布2024-10-21 21:27:09
650
发布2024-10-21 21:27:09
举报
文章被收录于专栏:一位计算机小白的学习日记

前言:

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

一、题目说明

      蜗蜗国最近很流行一个游戏,名字叫做“蜗蜗荣耀”。在这个游戏里,有排位赛的机制。玩家一开始拥有一个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,如果没有,计算还需要连胜几场才能达到王者段位。

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

代码语言:javascript
复制
//星星stars ,连胜场次win,连败场次lose,比赛总次数 n
#include <stdio.h>
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;
}

注意:

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 一、题目说明
  • 二、题目分析
  • 三、解题思路
  • 四、具体代码实现(含注释)
  • 注意:
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档