https://codeforces.com/contest/1553/problem/C

INPUT
4
1?0???1001
1111111111
??????????
0100000000
OUTPUT
7
10
6
9

题意
给T,给T组数据,每组数据是由0、1、?三种构成的串,长度为10,
题目背景是在足球赛中的罚球,10次轮流交替罚球,a、b队各5次,由题目给出的串中可以知道进球情况,如果假设第 i 次罚球中,串上 i 的位置为 ‘1’ 则此球必得分,为 ‘0’ 则没得分,‘?’则无法确定。
如果一支球队的进球数超过了另一支球队用剩余的所有踢球所能达到的进球数,那么点球阶段就会停止。(此条件作为主要的判定)
例如,如果在第 7 次踢球后,第一队进了 1 球,第二队进了 3 球,则罚球阶段结束——第一队不能进 3 球。
请求出球赛会在第几场后决出胜负,
思路:(dfs)我看也有不用dfs的,但是没有去研究
因为总共10场比赛,开爆搜没有问题
a为奇数场次踢球
b为偶数场次踢球
- 捋清在 i 场比赛后各自还能进的球数(注意是先打完第 i 场再判定结果)
-
i == 奇数
a方剩余(10 - i)/ 2 ;
b方剩余(10 - i)/ 2 + 1;举个例子 i==7,则a方剩余 1 场即第9场,而b方剩余 2 场:第8和第10
-
i == 偶数
a剩余 = b剩余 = (10 - i)/ 2;
- 下面上伪代码的思路
开dfs传递:第几轮数,a队得分,b队得分
int ans = 0x3f3f3f3f;
1.i == 10
ans = min(ans,i);
return;
2.i != 10 //a、b代表各队得分
{
1.i为奇数
{
1.必定进球 (a队得分,注意判定时候加上得分就比如下两行中的if内 a 要 +1 )
{
判断是否比赛结束(a+1 > b + b剩余 || b > a+1 + a剩余 ) (1.a>b则判断b是否能靠剩余场数超越,2.a<b则判断a是否能靠剩余场数超越)
{
1.比赛结束:
ans赋值,return;
2.比赛没结束
dfs( 下一轮 ,a队得分+1 , b队得分)
}
}
2.必不进球
{
判断是否比赛结束(a > b + b剩余 || b > a + a剩余)
{
1.比赛结束:
ans赋值,return;

该博客讨论了一种名为'C. Penalty'的问题,源自Codeforces的竞赛。问题涉及模拟足球比赛中罚球的情况,每队有10次罚球机会,由0、1、?三种符号表示进球情况。如果一队的进球数超过另一队剩余罚球所能达到的最高得分,比赛结束。博主提供了使用深度优先搜索(DFS)的解决方案,并给出了思路和伪代码。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



