站外题求助(玄关)
  • 板块灌水区
  • 楼主hatred
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/21 21:47
  • 上次更新2024/10/21 21:54:08
查看原帖
站外题求助(玄关)
1315074
hatred楼主2024/10/21 21:47

题目:

砍伐树木
时间限制:1秒        内存限制:128M
题目描述
------------
小华被小林叫去砍树,他需要砍倒m米长的木材。现

在,小华弄到了一个奇怪的伐木机。伐木机工作过程

如下:小华设置一个高度参数h(米),伐木机升起

一个巨大的锯片到高度h,并锯掉所有的树比h高的部

分(当然,树木不高于h米的部分保持不变)。小华

就得到树木被锯下的部分。 

例如,如果一行树的高度分别为20、15、10、17米,

小华把锯片升到15米的高度,切割后树木剩下的高度

将是15、15、10、15米,而小华将从第一棵树得到5

米,从第4棵树得到2米,共得到7米木材 

小华非常关注生态保护,所以他不会砍掉过多的木

材。这正是他为什么要尽可能高的设定伐木机锯片的

原因。帮助小华找到伐木机锯片的最大的整数高度

h,使得他能得到的木材至少为m米。换句话说,如果

再升高1米,则他将得不到m米木材
------------
输入描述
第一行两个整数n和m,n表示树木的数量,m表示需要

的木材总长度 

第二行n个整数,表示每棵树的高度,值均不超过

10^9.保证所有木材长度之和大于m,因此必然有解

输出描述
一行一个整数,表示砍树的最高高度
------------
样例:
输入
5 20
4 42 40 26 46
输出
36
提示
对于30%的数据:1<=n<=10,1<=m<=30 

对于70%的数据:1<=n<=10^3,1<=m<=10^4 

对于100%的数据:1<=n<=10^6,1<=m<=2*10^9

我的代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,r;
int a[10000000];
main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        r=max(r,a[i]);
    }
    sort(a+1,a+1+n);
    int l=0;
    while(l<r){
        int mid=(l+r-1)/2;
        int x=0;
        for(int i=n;i>=1;i--){
            if(a[i]>mid) x+=a[i]-mid;
            else break;
        }
        if(x>m){
            l=mid+1;
        }else{
            r=mid;
        }
    }
    cout<<l;
}
2024/10/21 21:47
加载中...