关于#C++#的问题,如何解决?

蜗蜗荣耀
描述
蜗蜗国最近很流行一个游戏,名字叫做“蜗蜗荣耀”。在这个游戏里,有排位赛的机制。玩家一开始拥有一个 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 颗星,因为这是连胜的第二场。

输入格式
第一行一个正整数 n。

接下来一行,一共 n 个数( 0 或者 1 ),中间用空格隔开,表示这 n 场蜗蜗的胜败状态。

输出格式
一行, 如果达到了(最后星数 ≥50)则为一个字符串Yes,否则为一个整数,表示蜗蜗至少还需要几场胜利才能够达到蜗蜗王者。

样例输入1
9
1 1 1 1 1 1 1 1 1
样例输出1
1
样例解释1
前面 9 场连胜总共获得的星星数量为 1 + 2 + …… + 9 = 45 。没有达到蜗蜗王者。

接下来再获胜 1 场,则为连胜的第十场,获得 10 颗星,总共有了 55 颗星,超过了 50 ,达到了蜗蜗王者。

样例输入2
16
1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 0
样例输出2
Yes
样例解释2
最后有 54 颗星,达到了蜗蜗王者。

数据范围
对于 100% 的数据,保证 1≤n≤5000。

有意思,你哪块不行啊

#include <iostream>
using namespace std;

int main()
{
    int last = 1,score = 0,n,m,total = 0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>m;
        if(i==0)
        {
            last = m;
            score = 1;
            if(m>0)
                total+=score;
        }
        else
        {
            if(m == 0) //如果输
            {
                if(last == 0) //之前输,累积扣分
                {
                    score++;
                    if(total >score)
                        total -= score;
                    else
                        total  = 0;
                }
                else//之前赢,切换状态
                {
                    score = 1;
                    last = 0;
                    if(total > 0)
                        total-= score;
                }
            }
            else //如果赢
            {
                if(last == 1) //之前赢,累积加分
                {
                    score++;
                    total += score;
                }
                else//之前输,切换状态
                {
                    score = 1;
                    last = 1;
                    if(total > 0)
                        total-= score;
                }
            }
        }
    }
    if(total < 50)
    {
        int num = 0;
        if(last < 0)
            score = 0;
        while(total < 50)
        {
            score++;
            total += score;
            num++;
        }
        cout<<num<<endl;
    }
    else
       cout<<"Yes"<<endl;
    return 0;
}



```c++
#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
参考下面代码

#include <iostream>

using namespace std;

const int N = 5010;

int n;
int a[N];

int main()
{
    cin >> n;

    for (int i = 0; i < n; i ++ ) cin >> a[i];

    int res = 0;
    int s = 0, w = 0;
    for (int i = 0; i < n; i ++ )
    {
        if (a[i] == 0)
        {
            w ++ ;
            s = max(0, s - w);
        }
        else
        {
            s += w + 1;
            w = 0;
        }

        if (s >= 50)
        {
            puts("Yes");
            return 0;
        }
    }

    int cnt = 0;
    while (s + (cnt + 1) * (cnt + 2) / 2 < 50) cnt ++ ;
    cout << cnt << endl;

    return 0;
}