bzoj5106 [CodePlus2017]汀博尔 二分

[CodePlus2017]汀博尔

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 202  Solved: 75
[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

感谢腾讯公司对此次比赛的支持。

Source

题解:

  就是裸的二分答案。

 1 #include<cstring>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cstdio>
 6 
 7 #define N 200007
 8 #define ll long long
 9 using namespace std;
10 inline int read()
11 {
12     int x=0,f=1;char ch=getchar();
13     while(ch>'9'||ch<'0'){if (ch=='-') f=-1;ch=getchar();}
14     while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
15     return x*f;
16 }
17 
18 int n;
19 ll a[N],h[N],S,L,mx;
20 
21 bool check(ll day)
22 {
23     ll ans=0;
24     ll now;
25     for(int i=1;i<=n;i++)
26     {
27         now = a[i]*day+h[i];
28         if(now>=L) ans+=now;
29         if(ans>=S) return true;
30     }
31     return false;
32 }
33 int main()
34 {
35     cin>>n>>S>>L;
36     for(int i=1;i<=n;i++) cin>>h[i];
37     for(int i=1;i<=n;i++) cin>>a[i],mx=max(mx,max(L,S)/a[i]);
38     ll l=0,r=mx,ans=0;
39     while(l<=r)
40     {
41         ll mid=(l+r)>>1;
42         if(check(mid)) r=mid-1;
43         else l=mid+1;
44     }
45     printf("%lld",l);
46 }
原文地址:https://www.cnblogs.com/fengzhiyuan/p/8119356.html