P1873 砍树 二分裸题

题意:给出n颗树,要砍这些树,工具会挥向这些高度不一的平行的树,掉落下来的高度的总和,就是砍掉的树的长度总和

   给出一个至少砍到的长度值(题目中的树的长度大于等于这个长度值)

   要求我们寻找一个最优的高度,让砍掉的数目长度尽量少,又能满足题意;

思路:这是二分经典题

   我们定义一个最大区间范围之后,就开始check跑二分即可。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=1e6+10;
 5 ll a[maxn];
 6 ll n,limit;
 7 ll check(ll x)
 8 {
 9     ll sum=0;
10     for(int i=1;i<=n;i++){
11         ll tmp=a[i]-x;
12         if(tmp<0) tmp=0;
13         sum+=tmp;
14     }
15     if(sum>=limit) return 1;
16     else return 0;
17 }
18 int main()
19 {
20     scanf("%lld%lld",&n,&limit);
21     for(int i=1;i<=n;i++)
22         scanf("%lld",&a[i]);
23     ll L=1;
24     ll R=2000000000;
25     ll ans;
26     while(L<=R){
27         ll mid=L+R>>1;
28         if(check(mid)){
29             ans=mid;
30             L=mid+1;
31         }
32         else R=mid-1;
33     }
34     printf("%lld\n",ans);
35     return 0;
36 }
View Code

 

posted @ 2020-04-09 21:54  古比  阅读(205)  评论(0编辑  收藏  举报