• [CodePlus2017]汀博尔


    Time Limit: 10 Sec  Memory Limit: 512 MB
    Submit: 158  Solved: 61
    [Submit][Status][Discuss]

    Description

    有n棵树,初始时每棵树的高度为Hi,第i棵树每月都会长高Ai。现在有个木料长度总量为S的订单,客户要求每块
    木料的长度不能小于L,而且木料必须是整棵树(即不能为树的一部分)。现在问你最少需要等多少个月才能满足
    订单。

    Input

    第一行3个用空格隔开的非负整数n,S,L,表示树的数量、订单总量和单块木料长
    度限制。
    第二行n个用空格隔开的非负整数,依次为H1,H2,...,Hn。
    第三行n个用空格隔开的非负整数,依次为A1,A2,...,An。
    1<=N<=200000,1<=S,L<=10^18,1<=Hi,Ai<=10^9

    Output

    输出一行一个整数表示答案。

    Sample Input

    3 74 51
    2 5 2
    2 7 9

    Sample Output

    7
    【 Hints】
    对于样例,在六个月后,各棵树的高度分别为 14, 47, 56,此时无法完成订单。在七个月后,各棵树的高度分别
    为 16, 54, 65,此时可以砍下第 2 和第 3 棵树完成订单了。

    HINT

    来自 CodePlus 2017 11 月赛,清华大学计算机科学与技术系学生算法与竞赛协会 荣誉出品。
    Credit:idea/郑林楷 命题/郑林楷 验题/王聿中
    Git Repo:https://git.thusaac.org/publish/CodePlus201711
    本次比赛的官方网址:cp.thusaac.org
    感谢腾讯公司对此次比赛的支持。

    思路

    二分月份即可,但要注意一下二分的上界什么的,不要爆longlong;

    代码实现

     1 #include<cstdio>
     2 #define LL long long
     3 const int maxn=2e5+10;
     4 inline LL max_(LL x,LL y){return x>y?x:y;}
     5 LL n,m,k,ax;
     6 LL a[maxn],b[maxn];
     7 bool ok(LL x){
     8     LL sum=m;
     9     for(int i=1;i<=n;i++)
    10     if(a[i]+x*b[i]>=k){
    11         sum-=a[i]+x*b[i];
    12         if(sum<=0) return 1;
    13     }
    14     return 0;
    15 }
    16 int main(){
    17     scanf("%lld%lld%lld",&n,&m,&k);
    18     for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    19     for(int i=1;i<=n;i++) scanf("%lld",&b[i]),ax=max_(ax,b[i]);
    20     LL mid,l=0,r=1+max_(m,k)/ax;
    21     while(l<r){
    22         mid=l+r>>1;
    23         if(ok(mid)) r=mid;
    24         else l=mid+1;
    25     }
    26     printf("%lld
    ",l);
    27     return 0;
    28 }
  • 相关阅读:
    第十四周课程总结&实验报告(简单记事本的实现)
    第十三周课程总结
    第十二周课程总结
    第十一周课程总结
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
    第五周课程总结&实验报告(四)
    2019JAVA课程总结
  • 原文地址:https://www.cnblogs.com/J-william/p/8066448.html
Copyright © 2020-2023  润新知