【蓝桥每日一题]-二分类型(保姆级教程 篇2) #砍树 #木材加工

今天讲二分的例题,一道是“砍树”,一道是“木材加工”

目录

题目:砍树

 思路1:

 思路2: 

题目:木材加工

  思路:


     

      

题目:砍树

          

 思路1:

     
二分查找:对高度进行二分
二分依据:该高度下砍出的木材
      

#include<bits/stdc++.h>          //砍树P1873  (二分查找)  O(nlogn)     
using namespace std;               
long long n,bz,s=0,mid,l,r,trees[1000008];
int main()
{
    scanf("%lld%lld",&n,&bz); 
    for(int i=1;i<=n;i++) 
    {
        scanf("%lld",&trees[i]);
        r=max(r,trees[i]);//找到最长木材 
    }
    while(l<=r)           //最右模板
    {
        mid=(l+r)/2; //从中间点开始作为伐木机高度
        s=0; 
        for(int i=1;i<=n;i++) 
			if(trees[i]>mid) 	s+=trees[i]-mid; //计算这个高度下砍的木材 
        if(s<bz)     //木材不足 
			r=mid-1;//减小高度增加木材 
		else 
			l=mid+1;//增加高度减小木材 
    }
    cout<<r; 
    return 0;
}

       

思路2: 

 先进行排序(从高到低),砍第i棵树时,按照第i+1棵树高度砍,则获得的新高度为(h(i+1)-h(i))*i     

(有点偏数学,不喜欢数学的小伙伴可以跳过了) 

#include<cstdio>                //砍树P1873   (贪心)(700毫秒)O(n)+O(n)*(logn)
#include<cstring>
#include<algorithm>       
using namespace std;
int tree[1000001];
int n,m;
int main()
{
    int i,num,ans;
    long long sum=0;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)    scanf("%d",&tree[i]);
    sort(tree+1,tree+n+1);           //默认按从低到高进行排序,那就倒着砍
    num=n;
    while(sum<m)
    {
        sum+=(tree[num]-tree[num-1])*(n-num+1);
        num--;
    }           
    ans=tree[num]+(sum-m)/(n-num);   //因为并不是真正的把数砍了,所以最后的高度还需要算出来
    printf("%d\n",ans);
    return 0;
}

       

       

题目:木材加工

        

 思路:

     
二分查找: 对最小段长度进行二分
二分依据: 该最小段下需要切的段数

     

#include <bits/stdc++.h>             //P2440木材加工    (二分查找)
using namespace std;
long long n, k;
long long a[1000005];
bool f(long long x) {
	long long ans = 0;
	for (int i = 1; i <= n; i++) {      //把每根木材按照x长度分成的段数相加
		ans += a[i] / x;
	}
	return ans >= k;                 //发现分的段比k多
}
int main() {
	cin >> n >> k;
	for (int i = 1; i <= n; i++) cin >> a[i];
	long long l = 0, r = 100000001;          //答案所在的区间
	long long mid;	
	while (l + 1 < r) {                    //开始二分
		mid = (l + r) / 2;
		if (f(mid)) l = mid;               //如果mid分的过多说明mid太小了,所以向右压缩
		else r = mid;                      
	}
	cout<<l<<endl;                    //输出重复的最后一个
//	while(l<=r){                     //或最右模板的
//		mid =(l+r)/2;
//		if(f(mid)) l=mid+1;
//		else r=mid-1;
//	}
//	cout<<r;
	return 0;
} 


http://www.niftyadmin.cn/n/5143515.html

相关文章

Java中如何实现重试机制?

摘要&#xff1a;在处理外部服务调用失败或不可靠的情况时&#xff0c;重试机制是一种常见且有效的技术手段。本文将介绍在Java中实现重试机制的最佳实践&#xff0c;包括设置重试次数、添加延迟和增加日志记录等。我们还将分享一些实际案例&#xff0c;以帮助读者更好地理解重…

如何使用手机提高拍照水平

使用手机提高拍照水平的一些技巧包括&#xff1a; 1.熟悉相机应用&#xff1a;了解相机应用的各种设置和功能&#xff0c;包括曝光、对焦、白平衡等&#xff0c;可以更好地控制拍照效果。 2.照明&#xff1a;注意光线的条件&#xff0c;尽量选择光线明亮、柔和的环境。避免背…

47GB水经微图从入门到精通视频教程

本视频教程共47GB&#xff0c;为了方便大家观看&#xff0c;同时录制了横版视频教程和竖版视频教程。 本视频教程的内容主要包括快速入门、地图标注、影像下载、高程下载和矢量下载几部分。 本文将列出所有视频教程所有内容。 快速入门&#xff08;23.1GB&#xff09; 如何…

3.网络之UDP

UDP协议 文章目录 UDP协议1. UDP概述2. UDP报文格式3. UDP传输限制4. UDP校验和4.1 CRC 循环冗余校验算法4.2 md5 校验算法 1. UDP概述 UDP&#xff08;UserDatagramProtocol&#xff09;是一个简单的面向消息的传输层协议&#xff0c;尽管UDP提供标头和有效负载的完整性验证&a…

复旦教授如何看待人工智能的出现?一句话:科技应该造福人类!

原创 | 文 BFT机器人 01 引言 今年5月1日当天&#xff0c;第一波AI失业潮到来。科技巨头IBM公司宣布暂停7800人的招聘&#xff0c;这些人的工作岗位将由AI取代。 此前3月底&#xff0c;高盛集团发布报告&#xff0c;预计全球将有3亿个工作岗位会被生成式AI取代&#xff0c;其…

Vue多级路由展示

注意事项&#xff1a;路由出口 <router-view :key"key" /> 注意事项&#xff1a;路径层级 // --------- 文件层级展示 ----------// // 文件&#xff1a; src // 文件&#xff1a; layouts // 文件&#xff1a;AppMain > index.vue // 二级展示出口…

【计算机网络】(谢希仁第八版)第三章课后习题答案

第三章 1.数据链路(即逻辑链路)与链路(即物理链路)有何区别? “电路接通了”与”数据链路接通了”的区别何在? 答&#xff1a;数据链路与链路的区别在于数据链路出链路外&#xff0c;还必须有一些必要的规程来控制数据的传输&#xff0c;因此&#xff0c;数据链路比链路多了…

Colorful Image Colorization灰度图像上色

论文标题&#xff1a;https://arxiv.org/pdf/1603.08511.pdf 论文地址&#xff1a;https://arxiv.org/pdf/1603.08511.pdf github地址&#xff1a;https://github.com/richzhang/colorization 论文信息概要 问题描述和背景 本文的研究问题是如何将灰度照片变成逼真的彩色图像…