首页 > 其他分享 >砍树 - 第一次写博客

砍树 - 第一次写博客

时间:2024-11-11 19:41:28浏览次数:1  
标签:arr Mirko 15 博客 样例 long 砍树 第一次 left

[COCI 2011/2012 #5] EKO / 砍树

题目描述

伐木工人 Mirko 需要砍 \(M\) 米长的木材。对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍伐森林。不过,Mirko 只被允许砍伐一排树。

Mirko 的伐木机工作流程如下:Mirko 设置一个高度参数 \(H\)(米),伐木机升起一个巨大的锯片到高度 \(H\),并锯掉所有树比 \(H\) 高的部分(当然,树木不高于 \(H\) 米的部分保持不变)。Mirko 就得到树木被锯下的部分。例如,如果一排树的高度分别为 \(20,15,10\) 和 \(17\),Mirko 把锯片升到 \(15\) 米的高度,切割后树木剩下的高度将是 \(15,15,10\) 和 \(15\),而 Mirko 将从第 \(1\) 棵树得到 \(5\) 米,从第 \(4\) 棵树得到 \(2\) 米,共得到 \(7\) 米木材。

Mirko 非常关注生态保护,所以他不会砍掉过多的木材。这也是他尽可能高地设定伐木机锯片的原因。请帮助 Mirko 找到伐木机锯片的最大的整数高度 \(H\),使得他能得到的木材至少为 \(M\) 米。换句话说,如果再升高 \(1\) 米,他将得不到 \(M\) 米木材。

输入格式

第 \(1\) 行 \(2\) 个整数 \(N\) 和 \(M\),\(N\) 表示树木的数量,\(M\) 表示需要的木材总长度。

第 \(2\) 行 \(N\) 个整数表示每棵树的高度。

输出格式

\(1\) 个整数,表示锯片的最高高度。

样例 #1

样例输入 #1

4 7
20 15 10 17

样例输出 #1

15

样例 #2

样例输入 #2

5 20
4 42 40 26 46

样例输出 #2

36

提示

对于 \(100\%\) 的测试数据,\(1\le N\le10^6\),\(1\le M\le2\times10^9\),树的高度 \(\le 4\times 10^5\),所有树的高度总和 \(>M\)。






[TIPS]

本题考查二分查找这一算法,形如下文。

while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            return mid;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }

题解

#include <iostream>
#include <algorithm>

using namespace std;
long long arr[10000010];


int main() {

    //录入n,m作为树木的数量,需要的木材总长度,和每棵树木的长度
    int n;
    long long m;
    scanf("%d%lld", &n, &m);

    for (int i = 0; i < n; i++) {
        scanf("%lld", &arr[i]);
    }

    // 排序
    sort(arr, arr + n);

    // 找到最长的木材, 作为右边界
    long long left = 0, right = arr[1];
    long long mid;
    for (int i = 0; i < n; i++) {
        if (arr[i] > right) right = arr[i]; 
    }

    // 二分查找
    while (left <= right) {
        mid = (left + right)/2;
        long long sum = 0;
        
        // 计算当前高度下能获得的木材总长度
        for (int j = 0; j < n; j++) 
            if (arr[j] > mid) sum += arr[j] - mid;


        if (sum<m) right = mid - 1; // 寻找更小的可能
        else left = mid + 1; // 寻找更大的可能

    }
    // 输出锯片的最高高度
    printf("%lld", right);
    return 0;
}

根据他人题解分析,二分查找中的平均值计算方法(如下)可能会出现整数溢出的问题。

\[mid = (left + right)/2; \]

可以换成如下方法以避免溢出

\[mid = left + (right - left) / 2; \]

或者用如下位运算进行除2操作 (可能提高效率)

\[mid = left + (right - left) >> 1; \]


结束语

没想到在这里还能学到markdown这种没听过的东西,感觉收获不少喜悦。同时感谢同学的博客激发我写下去,写好点的动力。

同学博客链接:砍树 - 土木牢盖 - 博客园

(•́⌄•́๑)૭✧

标签:arr,Mirko,15,博客,样例,long,砍树,第一次,left
From: https://www.cnblogs.com/fuzzz/p/18540350

相关文章

  • luogu P1873 砍树
    题目描述伐木工人Mirko需要砍M米长的木材。对Mirko来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍伐森林。不过,Mirko只被允许砍伐一排树。Mirko的伐木机工作流程如下:Mirko设置一个高度参数H(米),伐木机升起一个巨大的锯片到高度H,并锯掉所有树比H高的......
  • 第一次收到Follow的空投 试试看你能领多少
    今天Follow客户端突然弹出消息,提醒可以领取$POWER空投,点开一看竟然可以领取237个$POWER,爽啊!如何领取把上面的成就图片下载下来,加上你自己的订阅列表截图,发到社交媒体或个人博客上,然后把链接提交到Follow即可。传送门:https://follow.is/airdrop......
  • 砍树
    P1873砍树题目要砍M米长木材,需找到伐木机锯片的最大整数高度H,保证能得到至少M米木材,锯掉树比H高的部分,得到锯下部分木材,且再升高1米就得不到M米木材1≤N≤106,1≤M≤2×10e9,树的高度≤4×10e5,所有树的高度总和>MINPUT第1行2个整数N和M,N表示树木的数量,M表示需要的木......
  • 第 2 篇 Scrum 冲刺博客
    作业要求这个作业属于哪个课程计科34班这个作业的要求在哪里团队作业4——项目冲刺这个作业的目标1.站立式会议2.发布项目燃尽图3.每人的代码/文档签入记录4.适当的项目程序/模块的最新(运行)截图5.每日每人总结会议照片昨日已完成的工作/今天计划完成的工作......
  • 学生HTML个人网页作业作品 使用HTML+CSS+JavaScript个人介绍博客网站 web前端课程设计
    ......
  • 第 1 篇 Scrum 冲刺博客
    作业要求这个作业属于哪个课程计科34班这个作业的要求在哪里团队作业4——项目冲刺这个作业的目标1、认领任务2、规划明天任务3、项目预期任务量4、敏捷开发感想5、团队期望各个成员在Alpha阶段认领的任务成员任务梁俊轩功能测试与管理雷......
  • Java期末复习暨第一次上机课作业
    Java期末复习暨第一次上机课作业第一道题:第8行代码:35.6本来要赋值给double类型变量,现在赋值给 flaot类型变量f,就要强制类型转换为float类型。输出结果:第二道题: 定义了一个double型变量r并赋值为23.5,之后输出圆的面积。输出结果: ......
  • Vscode写笔记上传博客园
    Vscode上传博客园博客前面写了一个Typora上传图片的,我发现离线状态下的话,还是有一些图片看不了,问了其他师傅,决定用Vscode上传博客园的方式,刚刚成功,现在写一个博客来简单记录一下。1.下载Vscode(自己下,网上到处教程)2.下载相关插件3.配置你的博客来到这个页面就是配置成功......
  • 云上拼团GO指南——腾讯云博客部署案例,双11欢乐GO
    知孤云出岫-CSDN博客目录腾讯云双11活动介绍一.双十一活动入口二.活动亮点(一)双十一上云拼团Go(二)省钱攻略(三)上云,多类型服务器供您选择三.会员双十一冲榜活动(一)活动内容(二)新人上云福利腾讯云的应用场景1.部署博客的步骤2,安装博客环境腾讯云双11活动介绍腾......
  • 第1篇Scrum冲刺博客
    软件工程班级链接作业要求作业要求作业目标项目冲刺团队成员姓名学号王睿娴3222003968张颢严3222004426梁恬(组长)3222004467潘思言3222004423一、各个成员在Alpha阶段认领的任务二、明日各个成员的任务安排三、整个项目预期......