C. Penalty

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

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 场再判定结果)
  1. i == 奇数
    a方剩余(10 - i)/ 2 ;
    b方剩余(10 - i)/ 2 + 1;

    举个例子 i==7,则a方剩余 1 场即第9场,而b方剩余 2 场:第8和第10

  2. 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;
				
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值