站外题求助
  • 板块灌水区
  • 楼主xiaodi1
  • 当前回复6
  • 已保存回复6
  • 发布时间2025/1/8 13:02
  • 上次更新2025/1/8 20:22:23
查看原帖
站外题求助
1422311
xiaodi1楼主2025/1/8 13:02

题目背景

《熊出没》中,光头强总是砍树,这天李老板又来催光头强砍树了。于是,光头强提着超强电锯,偷偷进入了狗熊岭......

题目描述

这次光头强至少要给李老板上交 𝑘 米长的木材,幸运的是他发明的超强电锯一次可以从高度为 ℎ 的地方砍一排树,树上比 ℎ 高的那一部分就会被砍下来。光头强不敢从太低的地方砍树,因为那样很容易被发现,为了砍到至少 𝑘 米长的木材,能够选择的砍树的起始高度最高是多少?

输入格式

第一行两个整数 𝑛 , 𝑘 ,表示一排有 𝑛 棵树,至少上交 𝑘 米的木材。

第二行 𝑛 个整数 𝑎 [𝑖]

​ ,表示这排树的高度。

输出格式

一行一个整数, 表示最低高度。

如果光头强无法砍够 𝑘 k米长,则输出"-1"。

样例

输入数据 1 4 7 20 15 10 17

输出数据 15

数据范围

对于 30 % 的数据, 1 ≤ 𝑛 ≤ 1000 , 1 ≤ 𝑘 ≤ 1000 , 1 ≤ 𝑎 𝑖 ≤ 1000

对于 100 % 的数据, 1≤n≤10 ^ 5 ,1≤k≤10^ 9 ,1≤a i ​ ≤10 ^ 9 。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int n,k;
bool check(int x){
    int size=0;
    for(int i=0;i<n;i++){
        if(a[i]-x>=0)size+=a[i]-x;
    }
    return size>=k;
}
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++)cin>>a[i];
    int l=1,r=1e9+7;
    while(l<r){
        int mid=(l+r+1)>>1;
        if(check(mid))l=mid;
        r=mid-1;
    }
    if(check(l))cout<<l;
    else cout<<"-1";
    return 0;
}
2025/1/8 13:02
加载中...