【传送门:BZOJ5106】
简要题意:
给出n棵树,初始高度为h[i],每棵树每个月长高a[i]
现有一个客户,需要至少s长的总木材,而且每次截取的木材必须是一整颗树而且高度大于等于L
求出最少的月份满足客户要求
题解:
直接搞
二分月份,然后判断
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; typedef long long LL; LL h[210000],a[210000]; LL s,t,L;int n; bool check(LL x) { LL sum=0; for(int i=1;i<=n;i++) if(h[i]+a[i]*x>=L) sum+=h[i]+a[i]*x; if(sum>=s) return true; else return false; } int main() { scanf("%d%lld%lld",&n,&s,&L); for(int i=1;i<=n;i++) scanf("%lld",&h[i]); LL mx=0; for(int i=1;i<=n;i++){scanf("%lld",&a[i]);mx=max(mx,a[i]);} LL l=0,r=1+max(s,L)/mx,mid,ans; while(l<=r) { mid=(l+r)/2; if(check(mid)==true) { ans=mid; r=mid-1; } else l=mid+1; } printf("%lld\n",ans); return 0; }