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;
}