BZOJ5106: [CodePlus2017]汀博尔

【传送门: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;
}

 

posted @ 2018-03-08 21:12  Star_Feel  阅读(140)  评论(0编辑  收藏  举报