本道题是一位好友提供,小编觉得本道题还是很好滴,便拿来介绍一下咯!
蜗蜗国最近很流行一个游戏,名字叫做“蜗蜗荣耀”。在这个游戏里,有排位赛的机制。玩家一开始拥有一个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 <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;
}
本道题代码使用了变长数组,如果想要代码正常运行,请在支持变长数组的环境下使用。