蜗蜗国最近很流行一个游戏,名字叫做“蜗蜗荣耀”。在这个游戏里,有排位赛的机制。玩家一开始拥有一个 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 场中的倒数第二场是失败而最后一场是胜利,那么额外打的第一场会获得二颗星,因为这是连胜的第二场。
输入格式
第一行一个正整数 n。
接下来一行,一共 n个数( 0 或者 1 ),中间用空格隔开,表示这 n场蜗蜗的胜败状态。
输出格式
一行, 如果达到了(最后星数 ≥50)则为一个字符串Yes,否则为一个整数,表示蜗蜗至少还需要几场胜利才能够达到蜗蜗王者。
#include<bits/stdc++.h>
using namespace std;
int n;
int a[5001];
int sum=1,bug=1,dw=0,wc=0,wnm=0;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
switch (a[i]) {
case 0:
if(dw-sum>=0){
bug=1;
dw=dw-sum;
sum++;
}
else{
dw=0;
sum++;
}
break;
case 1:
sum=1;
dw=dw+bug;
bug++;
break;
}
}
if(dw>=50){
printf("Yes");
}
else{
wc=50-dw;
while(wc>0){
wc=wc-bug;
bug++;
wnm++;
}
printf("%d",wnm);
}
return 0;
}
该回答引用ChatGPT
以下是C++代码实现:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> record(n); // 记录每场比赛的胜负情况
for (int i = 0; i < n; i++)
cin >> record[i];
int star = 0; // 当前拥有的星星数
int combo = 0; // 当前连胜或连败的场次
int lose = 0; // 连败状态下已经丢失的星星数
for (int i = 0; i < n; i++)
{
if (record[i] == 1)
{
combo++; // 连胜状态下胜利,连胜场次加1
star += combo; // 获得的星星数为连胜场次之和
lose = 0; // 连败状态结束,已丢失的星星数清零
}
else
{
combo = 0; // 连胜状态结束,连胜场次清零
if (star == 0) // 没有星星了,不再丢失星星
continue;
lose++; // 连败状态下失败,已丢失的星星数加1
if (lose > 3) // 连败超过三场,丢失三颗星
{
star -= 3;
lose = 3; // 已丢失的星星数最多为三颗
}
else
star--; // 丢失一颗星
}
if (star >= 50) // 已获得50颗星,成为蜗蜗王者
{
cout << "Yes" << endl;
return 0;
}
}
// 打完所有比赛,没有达到蜗蜗王者
// 计算需要额外获得的星星数
int extraStar = 50 - star;
int extraGame = 0; // 需要额外打的比赛场次
for (int i = 1; i <= extraStar; i++)
{
if (combo + i > 3) // 连胜超过三场,不能获得额外星星
break;
extraGame++;
}
extraGame += extraStar; // 剩余的星星每场都可以获得
cout << extraGame << endl;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int stars = 0; // 初始星数为0
int max_stars = 0; // 最高星数为0
int continuous_win = 0; // 连胜次数为0
int continuous_lose = 0; // 连败次数为0
for (int i = 0; i < n; i++)
{
int result;
cin >> result;
if (result == 0) // 输了
{
continuous_win = 0; // 连胜次数清零
continuous_lose++; // 连败次数加1
if (stars > 0) // 已经有星星了
{
if (stars > 5) // 5颗星以上每次掉2星
{
stars -= 2;
}
else // 5颗星以下每次掉1星
{
stars--;
}
}
}
else // 赢了
{
continuous_win++; // 连胜次数加1
continuous_lose = 0; // 连败次数清零
if (continuous_win <= 3) // 连胜次数不超过3次,每次加1颗星
{
stars++;
}
else if (continuous_win <= 5) // 连胜次数不超过5次,第4次胜利加2颗星,第5次胜利加3颗星
{
stars += continuous_win;
}
else // 连胜次数超过5次,每次加3颗星
{
stars += 3;
}
}
if (stars > max_stars) // 更新最高星数
{
max_stars = stars;
}
if (max_stars >= 50) // 达到50颗星,输出Yes
{
cout << "Yes" << endl;
return 0;
}
}
// 没有达到50颗星,计算还需要多少场胜利
int remaining = 50 - max_stars; // 还需要的星数
int games_needed = remaining / 3 + ((remaining % 3 == 0) ? 0 : 1); // 计算需要的胜利场数
cout << games_needed + n << endl; // 总场数等于已经打的场数加上需要的场数
return 0;
}