问题 G: 电脑游戏------------------------------------二分(只要能枚举且具有单调性)

28 篇文章 0 订阅

题目描述
小明在玩电脑游戏。游戏中总共有q个关卡。每个关卡的开始,他都会有k滴血,初始得分0分,他需要抵抗n波怪物攻击,如果最终玩家的血量严格大于0滴则为胜利(等于0滴也不算胜利)。每波怪物攻击共有两种,第一种攻击是扣a滴血,但可以加1分,第二种攻击是扣b滴血(b<a),不能获得分数。现在,他想知道每一关是不是能玩出来(每一关共有n波攻击,对于每一波攻击,他要么选择抵抗第一种要么选择抵抗第二种,也就是说每次攻击他必须要选择承受抵抗一种,因为逃不掉),在每一关中如果能获得胜利则输出最大的得分,如果不可以则输出-1。
由于关卡太多了,所以他想请你来帮助他。
输入
第一行输入一个整数q(1≤q≤105),表示一共的关卡数。
下面q行表示q个关卡,每个关卡包含四个整数k,n,a和b(1≤k,n≤109,1≤b<a≤109),分别表示初始时的血量,该关卡中怪物要攻击的次数,每次攻击的2种情况。
输出
对于每个关卡,请输出一个整数。如果乐乐无法获得胜利则输出-1,如果乐乐可以胜利则输出最大的得分数。
样例输入 Copy
6
15 5 3 2
15 5 4 3
15 5 2 1
15 5 5 1
16 7 5 2
20 5 7 3
样例输出 Copy
4
-1
5
2
0
1
提示
在第一关中,乐乐在前4波攻击中选择抵抗a种攻击,获得4分,在第5波攻击中选择抵抗b种攻击,不得分,最后乐乐还有1滴血,并得4分。
在第二关中,乐乐无法完成游戏,虽然一开始有15滴血,算是他每次抵抗最弱的b=3的攻击,也需要少15滴血,最后血量变为0。

解析:
简单二分。
只要能枚举的且具有单调性,一定能二分(我这边的思维还没转换过来)!!!


#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1000;
typedef long long ll;
ll k,n,a,b;
int t;
bool check(ll x)
{
	if(x*a+(n-x)*b>=k) return false;
	return true;
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lld %lld %lld %lld",&k,&n,&a,&b);
		ll l=0,r=n;
		while(l<r)
		{
			ll mid=l+r+1>>1;
			if(check(mid)) l=mid;
			else r=mid-1;
		}
		if(!check(l)) printf("-1\n");
		else printf("%lld\n",l);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值