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
a−i 就是先手
b
r
e
a
k
break
break 对方赢得的场数,并且被对方
b
r
e
a
k
break
break
x
−
i
x-i
x−i 次(
i
<
=
a
i<=a
i<=a
&
&
\&\&
&&
x
−
i
<
=
b
x-i<=b
x−i<=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;
}
}
这篇博客探讨了一场网球比赛中,Alice和Bob的胜场情况。通过数学建模,计算了在不确定谁先发球的情况下,可能出现的Break点数量。文章提供了详细的算法思路,包括对每种发球情况的枚举,以及如何确定被对手Break的场次。最后,通过C++代码展示了如何找出所有可能的Break次数,并输出结果。
457

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



