火柴人打乒乓球
- 火柴人打乒乓球 推荐度:
- 相关推荐
火柴人打乒乓球
火柴人打乒乓球🏓の秘籍
模拟退 模拟退 模拟退🔥 法 法 法( 但 会 T 掉 最 后 一 个 点 )
题目背景
众所周知,一局乒乓球比赛分数先达到 11 11 11 分且领先对手 2 2 2 分的人获胜。但是如果是平局 10 : 10 10:10 10:10 则要超过对手 2 2 2 分才能获胜 ( ( (例如 12 : 10 ) 12:10) 12:10),如果双方都没能超过对手 2 2 2 分,这局比赛可能会一直持续下去。
由题目可以知道只要 x > y 由题目可以知道只要\mathrm x>\mathrm y 由题目可以知道只要x>y, 小 C 就一定会赢 小\mathbb C就一定会赢 小C就一定会赢, 小 C 可以一直让比赛延续下去 小\mathbb C可以一直让比赛延续下去 小C可以一直让比赛延续下去, 这样 这样 这样, 就使小 C 和小明的差距越拉越大 就使小\mathbb C和小明的差距越拉越大 就使小C和小明的差距越拉越大, 所以 所以 所以, 小 C 一定会赢。 小\mathbb C一定会赢。 小C一定会赢。
剩下的情况可以模拟出来 剩下的情况可以模拟出来 剩下的情况可以模拟出来, 我们先设一个 w i n & l o s e 我们先设一个\mathrm{win}\And \mathrm{lose} 我们先设一个win&lose, 分别记录输了得到的钱和赢后给出的钱 分别记录输了得到的钱和赢后给出的钱 分别记录输了得到的钱和赢后给出的钱, 特判一下—— i f ( m o n e y + w i n > 0 ) 则小 C 一定能拿下这场比赛 特判一下——\mathrm{if(money + win > 0)}则小\mathbb C一定能拿下这场比赛 特判一下——if(money+win>0)则小C一定能拿下这场比赛, 此时再设一个 a n s 来记录答案 此时再设一个\mathrm{ans}来记录答案 此时再设一个ans来记录答案, 否则就理性地以 ( 0 否则就理性地以(0 否则就理性地以(0: 11 ) 输给小明。 11)输给小明。 11)输给小明。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t, x, y, money = 0;
ll k;
signed main(){scanf("%d", &t);while(t--){money = 0;int ans = 0;scanf("%d%d%lld", &x, &y, &k);if(x > y){printf("%lld\n", k);continue;}else{while(k--){int win = 9 * x - 11 * y, lose = 11 * x;if(money + win > 0){money += win;ans++;}else money += lose;}}printf("%lld\n", ans);}return 0;
}
O ( n 2 ) → O ( 1 ) \mathrm O(\mathrm n^2)\to \mathrm O(1) O(n2)→O(1)
题目可以简单化为小 C 输的钱再除以掰回一局所需要的钱 题目可以简单化为小\mathbb C输的钱再除以掰回一局所需要的钱 题目可以简单化为小C输的钱再除以掰回一局所需要的钱, 最后求出来的答案就是小 C 最多可以赢多少场比赛 最后求出来的答案就是小\mathbb C最多可以赢多少场比赛 最后求出来的答案就是小C最多可以赢多少场比赛
小 C 输一局的钱 小\mathbb C输一局的钱 小C输一局的钱: 11 y → 小 C 输 k 局的钱 11\mathrm y \to 小\mathbb C\mathrm 输\mathrm k局的钱 11y→小C输k局的钱: 11 y k 11\mathrm{yk} 11yk
{ 赢 ( 11 : 9 ) 9 x − 11 y 输 ( 0 : 11 ) 11 x \begin{cases}赢(11:9) & \mathrm{9x-11y}\\输(0:11) & \mathrm{11x}\end{cases} {赢(11:9)输(0:11)9x−11y11x
小 C 掰回一局的钱 小\mathbb C掰回一局的钱 小C掰回一局的钱: 11 x − ( 9 x − 11 y ) = 2 x + 11 y \mathrm{11x - (9x - 11y) = 2x + 11y} 11x−(9x−11y)=2x+11y
⟹ a n s = 11 y k / ( 2 x + 11 y ) \implies \mathrm{ans=11yk/(2x+11y)} ⟹ans=11yk/(2x+11y)
#include<bits/stdc++.h>
using namespace std;
int t, x, y, k;
signed main(){scanf("%d", &t);while(t--){scanf("%d%d%d", &x, &y, &k);printf("%d\n", x > y ? k : 1ll * 11 * x * k / (2 * x + 11 * y));}return 0;
}
- ROS1云课→29如何借助导航实现走迷宫机器人
- 卷积与反卷积(转置卷积)关系的公式推导 及其各自的形式
- docker image 的sha256 digest摘要
- NullPointerException丢失异常堆栈信息
- 正确性、健壮性、可靠性、效率、易用性、可读性(可理解性)、可扩展性、可复 用性、兼容性、可移植性
- css复合选择器(后代选择器、子代选择器、并集选择器、链接伪类选择器、:focus选择器)
- 微软上海招 Principal Manager!
- 大数定律,方差
- anchors.fill和anchors.centerIn区别
- Linux 磁盘管理
- void指针(void *)是什么?如何使用它
- 网站制作流程
- nodejs 运行在tomcat
- 9个免费的 CSS 生成器网站
- Python 爬取网页
- Shiro系统权限管理、及原理剖析
- (十四)STM32——外部中断(EXTI)