[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
2 5 2
2 7 9
Sample Output
7
【 Hints】
对于样例,在六个月后,各棵树的高度分别为 14, 47, 56,此时无法完成订单。在七个月后,各棵树的高度分别
为 16, 54, 65,此时可以砍下第 2 和第 3 棵树完成订单了。
【 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\n",l); 27 return 0; 28 }