洛谷P2240木材加工
题目链接
洛谷P2240
题目描述
木材厂有 n根原木,现在想把这些木头切割成 k 段长度为l的小段木头(木头有可能有剩余)。
当然,我们希望得到的小段木头越长越好,请求出 l的最大值。
木头长度的单位是 cm,原木的长度都是正整数,我们要求切割得到的小段木头的长度也是正整数。
例如有两根原木长度分别为 11 和 21,要求切割成等长的 6 段,很明显能切割出来的小段木头长度最长为 5。
输入格式
第一行是两个正整数 n,k,分别表示原木的数量,需要得到的小段的数量。
接下来 n 行,每行一个正整数 Li,表示一根原木的长度。
输出格式
仅一行,即l的最大值。
如果连1cm 长的小段都切不出来,输出 0
。
上代码
#include <stdio.h>
#include <stdlib.h>
int find(int *a,int n,int high,int k);
int main()
{int *a=NULL;a=(int *)malloc(sizeof(int)*100002);int n,k;int high=0;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){scanf("%d",&a[i]);if(a[i]>high)high=a[i];}printf("%d",find(a,n,high,k));free(a);return 0;
}
int find(int *a,int n,int high,int k)
{int low=0,mid,x=0;int cnt;while(low<=high){mid=(high-low)/2+low;if(mid==0) break;cnt=0;for(int i=0;i<n;i++)cnt+=(a[i]/mid); if(cnt<k) high=mid-1;else{x=mid;low=mid+1;}}return x;
}
首先开个大数组(不清楚C语言中10^5能不能直接定义出来)。
int *a=NULL;
a=(int *)malloc(sizeof(int)*100002);
用的是C语言的malloc函数,函数在#include <stdlib.h>头文件中。sizeof()用来求int类型占用几个字节,用4代替sizeof(int)也不是没问题,但是尽量规范一些也不错。
malloc的函数声明大家自行百度,别忘了最后用free()函数释放内存。
int n,k;
int high=0;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
{scanf("%d",&a[i]);if(a[i]>high)high=a[i];
}
n,k是原木的数量和需要得到的小段的数量。high是保存输入原木长度的最大值,
for()循环用来存储树长,顺便找出最高树。
重点来了
int find(int *a,int n,int high,int k)
给大家说说这个函数我的想法。
int find(int *a,int n,int high,int k)
{//函数的形参对应的是数组地址,树的个数(避免越界),最高树和需要得到的数量.int low=0,mid,x=0;//x为返回值 int cnt;//cnt用来计数,和k比较 while(low<=high){mid=(high-low)/2+low;//不用mid=(high+low)/2是避免high+low太大越界 if(mid==0) break;/*解释下这个判断的作用如果k值过大,重复循环时会一直执行high=mid-1;可能出现类似high:8到3到1再到0当high=0时 mid也为0,无法执行a[i]/mid;所以此时退出循环,返回x=0;(第四个还是第五个点会用上) */ cnt=0;for(int i=0;i<n;i++)cnt+=(a[i]/mid); //计算总共能分几段 if(cnt<k) high=mid-1;else{ /*cnt>=k,用x保存此时树长 ,然后low=mid+1一步步逼近如果cnt>=k仍成立,接着存到x里 */x=mid;low=mid+1;}}return x;//x就是最终每一段长
}
洛谷P2240木材加工相关推荐
- 洛谷 P2440 木材加工(二分,含边界处理的笔记)
题目链接: 木材加工 - 洛谷https://www.luogu.com.cn/problem/P2440 非常简单的题目,用left和right控制二分边界,ans一开始是0,每次check到符合 ...
- 洛谷 P2440 木材加工 (二分答案)
P2440 木材加工 题意 给定N个木头及其长度,要求把这些木头切割成M块长度相同的小段木头(木头有可能有剩余),求小段木头的最大值. 比如:有两木头长度为 11 和 21, 要求切成 6 块, 那么 ...
- 贪心算法——部分背包(洛谷 P2240)
贪心算法--部分背包问题 部分背包问题,顾名思义,部分 就是可以取一部分,也就是可以随意拆分的物品,是最简单经典的贪心问题. 解题步骤: 1)用结构体数组保存每个物品的价值及总重量.平均价值: 2)输 ...
- 洛谷——P2440 木材加工
https://www.luogu.org/problem/show?pid=2440#sub 题目背景 要保护环境 题目描述 题目描述: 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木 ...
- 二分答案——洛谷P2440木材加工
题目描述 问题分析 这个题目是一类典型的二分答案问题,题目中给出我们需要将给定的长度切割成相应的K段,并且保证切割的小段的最大长度,那么我们怎么做呢,必然是在一定的区间枚举出来该切成多少才能满足切成k ...
- 洛谷p2240部分部分背包问题c语言(数组实现)
部分背包问题网上都是c++实现,而且使用结构体,这里给小白提供一种c语言方法,并且不需要结构体,只需要数组便可以 #include <stdio.h> int main() { doubl ...
- 二分答案——木材加工(洛谷 P2440)
题目选自洛谷P2440 读完题目后应该有个大致思路,看得出来是二分查找的题. 首先我们输入 n 和 k 并且运用二分找到合适的尺寸,而l 必须要足够小,r 必须要足够的大.题中写道数组中的数最大不会超 ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- 洛谷 P1142 轰炸
洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...
最新文章
- Log4Net五步走
- 洛谷P4513 小白逛公园
- php将配置信息写入文件,Php写入配置文件的经典漏洞
- 【统计学习】参数估计
- NetGear 夜鹰 RAX40V2 设备与固件分析
- Python 基础教程:常用函数整理
- 二叉树结构 codevs 1029 遍历问题
- VMWare虚拟机-锁定文件失败,打不开磁盘的解决办法
- iPhone 14不会全部采用挖孔屏 仅两款Pro版采用
- android webview 字体被放大,Android WebView文字大小调整及页面缩放调整
- C++ string用法
- linux vi 编辑命令
- Hive入门学习随笔(二)
- 全国草地资源类型分布数据/植被类型分布数据/土地利用类型分布数据
- adb—fastboot—Download Honor 4C ClockworkMod (Cofface) Custom Recovery
- C语言学习-小甲鱼(第一天随堂笔记)
- 计算机显示10的负次方,我输入10的9次方在EXCEL里,为什么总变成日期了?怎么办/excel10的负次方怎么打...
- 肿瘤外显子数据分析 -- 20201119
- 大数据技术之_16_Scala学习_11_客户信息管理系统+并发编程模型 Akka+Akka 网络编程-小黄鸡客服案例+Akka 网络编程-Spark Master Worker 进程通讯项目
- 使用 React-Sketchapp