火柴人打乒乓球

火柴人打乒乓球🏓の秘籍

模拟退 模拟退 模拟退🔥 法 法 ( 但 会 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局的钱 11yCk局的钱 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)9x11y11x

小 C 掰回一局的钱 小\mathbb C掰回一局的钱 C掰回一局的钱 11 x − ( 9 x − 11 y ) = 2 x + 11 y \mathrm{11x - (9x - 11y) = 2x + 11y} 11x(9x11y)=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;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值