【刷题笔记】--二分-P2440 木材加工

news2024/11/15 5:06:08

题目: 

思路: 

先在所有树中找到最长的树,从 1 这个最长的树的长度 的所有数作为二分查找的值,让每棵树除这个值,表示可以切出几段出来,累加在一起得到s,s表示一共有几段。s与k比较,如果s==k,表示找到了切出每段的长度,但此时并不能就结束了,也有可能这个长度再长一点,也可以切出我们要的k段。

一开始写的错误代码:

#include<stdio.h>
int cmp(const void *a,const void *b){
	return *(int *)a-*(int *)b;
}
int main(){
	long long n,k;//n是指有n根原木,k是指切出k段 
	scanf("%lld %lld",&n,&k);
	int i;
	long long tree[1000005];
	for(i=0;i<n;i++){
		scanf("%lld",&tree[i]);
	}
	long long sum=0;
	for(i=0;i<n;i++){
		sum+=tree[i];
	}	
	if(sum/k==0){
		printf("0");
		return 0;
	} 
	qsort(tree,n,sizeof(tree[0]),cmp);
	long long left=1;
	long long right=tree[n-1];
	long long s=0;
	while(left<=right){
		s=0;
		long int mid=(left+right)/2;
	
		for(i=0;i<n;i++){
			s+=tree[i]/mid;
		}

		if(s>k){
			left=mid+1;
		}
		else if(s<k){
			right=mid-1;
		}
		else{
			printf("%lld",mid);
			break;
		}
	}
	return 0;
}

错就错在了我把s==k的情况单独分出来,然后就break了。

正确的代码:

#include<stdio.h>
int max(int a,int b){
    if(a>b){
        return a;
    }
    else{
        return b;
    }
}
int main(){
	long long n,k;//n是指有n根原木,k是指切出k段 
	scanf("%lld %lld",&n,&k);
	int i;
	long long tree[1000005];
	long long max1=0;
	for(i=0;i<n;i++){
		scanf("%lld",&tree[i]);
		max1=max(tree[i],max1);
	}
	long long sum=0;
	for(i=0;i<n;i++){
		sum+=tree[i];
	}	
	if(sum/k==0){
		printf("0");
		return 0;
	} 
	
	long long left=1;
	long long right=max1;
	long long s=0;
	long long ans;
	while(left<=right){
		s=0;
		long long mid=(left+right)/2;
		for(i=0;i<n;i++){
			s+=tree[i]/mid;
		}
		if(s>=k){
			left=mid+1;
		}
		else{
			right=mid-1;
		}
			
	}
	printf("%lld",left-1);
	return 0;
}

 我们来重点分析这一段:

        if(s>=k){
			left=mid+1;
		}
		else{
			right=mid-1;
		}
printf("%lld",left-1);

其实这种只写两种情况,很好理解,当找到s==k时,left会继续往右走,跨过当前我们找到的这个mid的值, 如果右边还存在可以满足我们要的s==k的情况,就会继续进入s>=k的条件下,然后left又会跨过我们要的mid的值,而如果右边范围不存在s==k,或者s>k也不成立,那么就只会一直进入right=mid-1;此时,left一直没动,right一直在往左移,直到right移到了left左边,循环结束,输出left-1,就是我们当时要的mid值。

有个问题需要注意的是,为什么这个s==k的情况要连在s>k一起写,而不是和s<k,因为当找到s==k的情况时,我们还要再找有没有就是可以切出更长段的k段,所以肯定是要往数值大的方向去找,所以执行的语句是left=mid+1;而不是right=mid-1;

其实也可以拆开写:

        if(s>k){
			left=mid+1;
		}
		else if(s<k){
			right=mid-1;
		}
		else{
		    left=mid+1;
		}			
	


	printf("%lld",left-1);

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/400196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows如何安装两个版本的mysql的方法

Windows上安装两个版本的mysql 背景&#xff1a;在学习项目的时候&#xff0c;项目中使用mysql5.7的版本&#xff0c;而自己的windows系统中安装的是mysql8.0版本&#xff0c;在尝试将项目中的mysql5.7版本的代码更改到8.0版本后仍然报错&#xff0c;故尝试更改windows系统中的…

低代码有哪些典型应用场景?

低代码有哪些典型应用场景&#xff1f; 低代码是一种全新的应用开发方式&#xff0c;它通过可视化的拖拽式界面&#xff0c;将传统的繁琐代码编写转化为简单的拖拽操作&#xff0c;让非技术人员也能够快速地开发出应用程序。 随着数字化转型的不断加速&#xff0c;低代码平台…

1.webpack的基本使用

webpack是做工程化用的&#xff0c;并且可以对代码进行压缩(搞成min.js那样)&#xff0c;处理浏览器端JS兼容性&#xff0c;性能优化 vue-cli与webpack作用相同 目录 1 基本使用 1.1 引入场景 1.2 安装webpack 1.3 配置webpack 1.4 使用webpack 2 webpack.config.…

C++11:lambda表达式

文章目录1. 概念2. 语法3. 示例示例1示例2示例3示例44. 捕捉方式基本方式隐式和混合补充5. 传递lambda表达式示例6. 原理7. 内联属性1. 概念 lambda表达式实际上是一个匿名类的成员函数&#xff0c;该类由编译器为lambda创建&#xff0c;该函数被隐式地定义为内联。因此&#…

某智能驾驶企业:CACTER云网关为O365系统护航

01 客户背景 某智能驾驶企业是一家国际性的高科技创新型企业&#xff0c;在智能驾驶领域处于全球领先地位&#xff0c;专注于为广大客户提供个性化的智能驾驶解决方案&#xff0c;共建美好智能新时代。 使用产品&#xff1a;CACTER邮件安全云网关 02 痛点难点问题 根据Corema…

Hive---sqoop安装教程及sqoop操作

sqoop安装教程及sqoop操作 文章目录sqoop安装教程及sqoop操作上传安装包解压并更名添加jar包修改配置文件添加sqoop环境变量启动sqoop操作查看指定mysql服务器数据库中的表在hive中创建一个teacher表跟mysql的mysql50库中的teacher结构相同将mysql中mysql50库中的sc数据导出到h…

k8s学习之路 | k8s 工作负载 DaemonSet

文章目录1. DaemonSet 基础1.1 什么是 DS1.2 DS 的典型用法1.3 如何编写 DS 资源1.4 DS 示例文件1.5 DS Pod 是如何被调度的1.6 更新 DS1.7 DS 替代方案1.8 DS 工作负载字段描述2. DaemonSet 的使用2.1 每个节点运行一个2.2 DS 更新策略2.3 滚动更新2.4 OnDelete 更新2.6 更新回…

重新认识下网页水印

使用背景图图片 单独使用 css 实现&#xff0c;使用 backgroundImage&#xff0c;backgroundRepeat 将背景图片平铺到需要加水印的容器中即可。 如果希望实现旋转效果&#xff0c;可以借助伪元素&#xff0c;将背景样式放到伪元素中&#xff0c;旋转伪元素实现&#xff1a; &l…

CHAPTER 5 文件共享 - FTP

文件共享 - FTP1 FTP1.1 传输方式1. ASCII传输方式2. 二进制传输模式3. 两种传输方式的区别1.2 支持的模式1. 主动模式(PORT)2. 被动模式(PASV)3. 如何选择4. 为什么绝大部分互联网应用都是被动模式&#xff1f;1.3 搭建FTP服务器&#xff08;使用vsftpd&#xff09;1. 安装软件…

计算机中信息的表示和处理 整数和小数的二进制表示

信息的表示和处理整数进制字移位运算无符号数和有符号数加法运算小数定点表示IEEE 浮点表示规格化和非规格化舍入浮点运算现代计算机存储和处理的信息以二值信号表示&#xff0c;这些二进制数字称为位&#xff0c;为什么要用二进制来进行编码&#xff1f;因为二进制只有1和0两种…

信捷 XDH Ethercat A_STOP指令

本指令使运动中的轴进行减速停止/急停。最常见的情况是用来停止以指定速度运行的轴。只要在运动&#xff0c;都可以用本指令停止。上图中&#xff0c;在M150的上升沿&#xff0c;执行A_STOP指令。A_STOP HD150 D150 M151 K0HD150--输入参数起始地址&#xff0c;HD158--输入参数…

创宇猎幽APT流量监测系统获CSTC年度网络安全优秀案例

近日&#xff0c;由中国软件评测中心发起的“2022 年度网络安全和数据安全优秀案例评选”活动评选结果正式公布。在众多参与案例中&#xff0c;创宇猎幽APT流量监测系统&#xff08;NDR&#xff09;凭借出色的行业场景实践和出众的产品表现力脱颖而出&#xff0c;成功入选“202…

5、score diffusion model

DDIM中遇到的Score-based SDE这里采用表示神经网络的预测值&#xff0c;用表示。同时等价于DDPM回顾贝叶斯公式原始公式前向过程表示连乘反向过程由前向过程可知&#xff1a;所以&#xff1a;正态分布&#xff1a;重参数技巧&#xff1a;反向过程&#xff1a;优化目标&#xff…

ASP.NETCore学习资料

1.ASP.NETCore比ASP.NET更具优势的地方是什么&#xff1f; ASP.NET Core(ASP.NET Core 简介) ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET(ASP.NET 简介) ASP.NET 是一个成熟的框架&#xff0c;提…

Git学习笔记(七)——其他操作

一、自定义Git Git除了配置user.name 和user.email 还有很多可配置项。 &#xff08;1&#xff09;命令git config --global color.ui true 让Git显示颜色&#xff0c;会让命令输出看起来更醒目.Git 会适当显示不同的颜色。 $ git config --global color.ui true查看分支会有…

延迟队列docker插件

文章目录 目录 文章目录 前言 一、环境准备与使用 总结 前言 一、环境准备与使用 下载对应版本的插件 https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases 然后在虚拟机上随便找个文件夹 cd /home/docker 先把容器运行 然后在当前文件下 将插件拷贝…

半入耳式耳机运动会不会掉、佩戴超稳固的运动耳机推荐

现在越来越多的人开始意识到运动的重要性&#xff0c;用运动给身体增加一道“防护墙”是最好的生活方式了&#xff0c;不过&#xff0c;日复一日做着几乎相同的动作&#xff0c;难免索然无味&#xff0c;所以很多人都会选择在运动时戴上耳机听歌解闷&#xff0c;这时候也有不少…

选射频线缆的困难和调试多链路匹配板子的心酸

今日痛点&#xff1a;选电缆和板子出问题 选线缆选到后面&#xff1a;有同事给我说&#xff0c;我还要高精度转接头&#xff0c;我还要BNC转接头 ​ 你们如果知道我选择线缆的艰辛&#xff0c;换做你们会怎么想 附上我选择线缆的心得&#xff1a; 1.S11尽量要考虑桌子的宽度&a…

Vector - CAPL - 文件处理函数

在当前平台化的趋势下,就算是协议层测试依然需要适配各种各样的项目,也需要处理各类型的文件,那我们如何对文件进行读取、写入、修改等类型的操作呢?今天我们就会介绍此类型的函数,主要适用于text、bin文件的处理。 打开文件 Open

MySQL之Explain分析

4 Explain分析&#xff08;重点&#xff09; 4.1 Explain介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句&#xff0c;分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字&#xff0c;MySQL 会在查询上设置一个标记&#xff0c;执行查询会返回执行…