其实这道是个二分答案的模板题,我们可以二分出一个 midmidmid 进行判断,遍历每一个 gig_igi,看一看 b×midb\times midb×mid 是否大于 gig_igi。如果大于,就不用理它;否则就将 sumsumsum 加上需要攻击多少次。最后再判断,如果 sum≤midsum\leq midsum≤mid 就用 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;
}