#740 div2 B (思维,枚举

这篇博客探讨了一场网球比赛中,Alice和Bob的胜场情况。通过数学建模,计算了在不确定谁先发球的情况下,可能出现的Break点数量。文章提供了详细的算法思路,包括对每种发球情况的枚举,以及如何确定被对手Break的场次。最后,通过C++代码展示了如何找出所有可能的Break次数,并输出结果。
摘要由CSDN通过智能技术生成

B. Charmed by the Game
题意:
两个人打球,谁先发球不确定。
A发球并且胜利是 A Hold,输掉就是 B Break,B获胜
B发球并且胜利是 B Hold,输掉就是 A Break,A获胜
给你两人获胜的场次,Alice获胜 a a a 次,Bob获胜 b b b 次,求所有可能的发生 Break 的次数。
思路:
一共进行了 a + b a+b a+b 场游戏,先手进行了 ( a + b + 1 ) / 2 (a+b+1)/2 (a+b+1)/2 场,枚举先手 H o l d Hold Hold 的场次。
假设 A l i c e Alice Alice 先手
当前先手 H o l d Hold Hold i i i 场,那么 a − i a-i ai 就是先手 b r e a k break break 对方赢得的场数,并且被对方 b r e a k break break x − i x-i xi 次( i < = a i<=a i<=a & & \&\& && x − i < = b x-i<=b xi<=b
A A A B B B 都先手来一遍插入 s e t set set 输出即可

#include<bits/stdc++.h>
using namespace std;
#define ll long long

int main()
{
    int T, a, b;cin>>T;
    while(T--)
	{
        cin >> a >> b;
        set <int> s;
         int n = a + b;
        int x = (n + 1) / 2;
        //   先手发球场数 
        for (int i = 0; i <= x; ++i)// A先手Hold的场数 
		{
            if (b >= x - i && a >= i)
			{
                int ans = x - i + a - i;
             // 被B break掉的   A break对方赢的
                s.insert(ans);
            }
        }
    	for (int i = 0; i <= x; ++i)// B先手Hold的场数 
		{
            if (a >= x - i && b >= i)
			{
                int ans = x - i + b - i;
                s.insert(ans);
            }
        }
        cout << s.size() <<endl;
        for (auto w : s) cout << w << " ";
        cout << endl;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值