题目链接

洛谷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木材加工相关推荐

  1. 洛谷 P2440 木材加工(二分,含边界处理的笔记)

     题目链接: 木材加工 - 洛谷https://www.luogu.com.cn/problem/P2440 非常简单的题目,用left和right控制二分边界,ans一开始是0,每次check到符合 ...

  2. 洛谷 P2440 木材加工 (二分答案)

    P2440 木材加工 题意 给定N个木头及其长度,要求把这些木头切割成M块长度相同的小段木头(木头有可能有剩余),求小段木头的最大值. 比如:有两木头长度为 11 和 21, 要求切成 6 块, 那么 ...

  3. 贪心算法——部分背包(洛谷 P2240)

    贪心算法--部分背包问题 部分背包问题,顾名思义,部分 就是可以取一部分,也就是可以随意拆分的物品,是最简单经典的贪心问题. 解题步骤: 1)用结构体数组保存每个物品的价值及总重量.平均价值: 2)输 ...

  4. 洛谷——P2440 木材加工

    https://www.luogu.org/problem/show?pid=2440#sub 题目背景 要保护环境 题目描述 题目描述: 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木 ...

  5. 二分答案——洛谷P2440木材加工

    题目描述 问题分析 这个题目是一类典型的二分答案问题,题目中给出我们需要将给定的长度切割成相应的K段,并且保证切割的小段的最大长度,那么我们怎么做呢,必然是在一定的区间枚举出来该切成多少才能满足切成k ...

  6. 洛谷p2240部分部分背包问题c语言(数组实现)

    部分背包问题网上都是c++实现,而且使用结构体,这里给小白提供一种c语言方法,并且不需要结构体,只需要数组便可以 #include <stdio.h> int main() { doubl ...

  7. 二分答案——木材加工(洛谷 P2440)

    题目选自洛谷P2440 读完题目后应该有个大致思路,看得出来是二分查找的题. 首先我们输入 n 和 k 并且运用二分找到合适的尺寸,而l 必须要足够小,r 必须要足够的大.题中写道数组中的数最大不会超 ...

  8. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  9. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

最新文章

  1. Log4Net五步走
  2. 洛谷P4513 小白逛公园
  3. php将配置信息写入文件,Php写入配置文件的经典漏洞
  4. 【统计学习】参数估计
  5. NetGear 夜鹰 RAX40V2 设备与固件分析
  6. Python 基础教程:常用函数整理
  7. 二叉树结构 codevs 1029 遍历问题
  8. VMWare虚拟机-锁定文件失败,打不开磁盘的解决办法
  9. iPhone 14不会全部采用挖孔屏 仅两款Pro版采用
  10. android webview 字体被放大,Android WebView文字大小调整及页面缩放调整
  11. C++ string用法
  12. linux vi 编辑命令
  13. Hive入门学习随笔(二)
  14. 全国草地资源类型分布数据/植被类型分布数据/土地利用类型分布数据
  15. adb—fastboot—Download Honor 4C ClockworkMod (Cofface) Custom Recovery
  16. C语言学习-小甲鱼(第一天随堂笔记)
  17. 计算机显示10的负次方,我输入10的9次方在EXCEL里,为什么总变成日期了?怎么办/excel10的负次方怎么打...
  18. 肿瘤外显子数据分析 -- 20201119
  19. 大数据技术之_16_Scala学习_11_客户信息管理系统+并发编程模型 Akka+Akka 网络编程-小黄鸡客服案例+Akka 网络编程-Spark Master Worker 进程通讯项目
  20. 使用 React-Sketchapp

热门文章

  1. 基于S3c244的input输入子系统
  2. JDBC操作数据库——resultset的操作小窍门
  3. 正则表达式 - 自动生成器
  4. Android微信通讯录界面代码,Android中使用Expandablelistview实现微信通讯录界面
  5. 接入支付宝电脑网站支付实现JAVA版
  6. 字库软件-字模III
  7. JSPatch转换器:可直接将OC代码转换成JS代码
  8. 旅游类App的原型制作分享-Klook
  9. EXCEL数据计算结果不对
  10. 还在自己手写请假流程吗?Activiti7帮你快速请假!!!