[ABC063D] Widespread ——题解

文章讲述了如何使用二分搜索策略解决一个关于怪物战斗的问题,计算在给定条件下,需要对怪物进行多少次攻击才能达到目标。通过逐次缩小范围确定最小攻击次数并记录答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实这道是个二分答案的模板题,我们可以二分出一个 midmidmid 进行判断,遍历每一个 gig_igi,看一看 b×midb\times midb×mid 是否大于 gig_igi。如果大于,就不用理它;否则就将 sumsumsum 加上需要攻击多少次。最后再判断,如果 sum≤midsum\leq midsummid 就用 ansansans 记录一下答案,再缩小二分中 rrr 范围。否则将 lll 缩小,再继续二分,最后输出 ansansans 就行了。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a,b;//分别表示怪物的数量,爆炸中心的魔物减少的体力,其他魔物减少的体力 
int g[1000005];//表示每个怪物的体力 
int ans;//用来记录答案 
bool pd(int x)
{
	int sum=0;//统计 
	for(register int i=1;i<=n;i++)
	{
		if(x*b<g[i])//不能直接被击败 
		{
			sum+=ceil((g[i]-x*b)/(1.0*(a-b)));//加上需要攻击多少次
		}
	}
	return sum<=x?true:false;//判断是否符合 
}
signed main()
{
	cin>>n>>a>>b;
	for(register int i=1;i<=n;i++)
	{
		cin>>g[i];//输入 
	}
	int l=1,r=INT_MAX;//因为不知道范围,所以设定一个极大值 
	while(l<=r)//二分 
	{
		int mid=(l+r)/2;//求中值 
		if(pd(mid)==true)//合法 
	    {
	    	ans=mid;//记录 
	    	r=mid-1;
		}
		else
		{
			l=mid+1;
		}
	}
	cout<<ans;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值