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 }