[CodePlus2017]汀博爾

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

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;git

代碼實現

 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 }
相關文章
相關標籤/搜索