非常经典的二分答案模型。
最小值最大,最大值最小,通常用二分答案,确定答案后,配合贪心,DP等算法检验答案是否合理,
将最优性问题转换为判定性问题。
本题中,可以发现,二分答案轰炸次数,显然满足单调性,然后进行简单判定就好了。
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #include<stack> #include<queue> using namespace std; typedef long long ll; const int maxn = 100100; int n; ll A,B,tot,ma,cnt; ll hel[maxn],hc[maxn]; ll read(){ ll s=0,f=1; char ch=getchar(); while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0' && ch<='9'){ s=s*10+ch-'0'; ch=getchar(); } return s*f; } bool check(ll T){ cnt=0; for(int i = 1; i <= n ; i++){ hc[i]=hel[i]-1ll*T*B; if(hc[i]>0){ if(hc[i]%(A-B)==0){ cnt+=hc[i]/(A-B); }else{ cnt+=(hc[i]/(A-B))+1; } } } return cnt<=T?true:false; } ll Binary_Search(){ ll L=1,R=ma/B+1,ans; while(L<=R){ // printf("%lld %lld ",L,R); ll mid=(L+R)>>1; if(check(mid)) ans=mid,R=mid-1; else L=mid+1; } return ans; } int main(){ tot=0; cnt=0; ma=0; n=read(),A=read(),B=read(); for(int i=1;i<=n;i++){ hel[i]=read(); ma=max(ma,hel[i]); } printf("%lld",Binary_Search()); return 0; }