模拟 T1

A-World Final? World Cup! (I)_2023牛客寒假算法基础集训营1 (nowcoder.com)

思路

模拟点球比赛, 交替罚球, A队先罚, 罚中加一分。给你10场每场的结果, 判断点球比赛会在踢完几球时结束, 或者未分出胜负。

先看如何判断在第几球时结束, 因为比赛规则是多一分就算赢, 且固定只有10场, 那么假如打完第六场, B(偶数场)赢了3球, A(奇数场)赢了0球, 即使A后面的7,9两场全赢, B后面8,10场全输, 也是B赢。

当B和A的比分差大于A后面场数时, 该比赛必定A输。 当A和B的比分差大于B后面场数时, 该比赛必定B输。

这里没有让求谁赢, 只需要知道哪一场分出胜负即可。故当比分差大于A或B后面场数时, 说明在当前场次决出了胜负。

那么未分出胜负时候就是之前没有决出胜负时, 再输出。定义一个布尔值flag储存是否分出胜负即可。

代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    while(n--)
    {
        string s;
        cin >> s;
        int res1 = 0, res2 = 0; // A得分, B得分
        bool flag = false;
        for(int i = 1; i <= 10; i++)
        {
            if(i & 1)
                res1 += s[i-1] == '1';
            else
                res2 += s[i-1] == '1';
            if(res1 - res2 > (10 - i + 1) / 2 || res2 - res1 > (10 - i) / 2)
            {
                cout << i << endl;
                flag = true;
                break;
            }
        }
        if(flag) continue;
        cout << -1 << endl;
    }
    return 0;
}