C++知识点总结(36):二分进阶练习

二分答案练习

  • 一、愤怒的羊驼
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例1
    • 提示
    • 参考答案
  • 二、偷吃西瓜
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例1
    • 提示
    • 参考答案
  • 三、丢沙包
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例1
    • 提示
    • 参考答案
  • 四、木材加工
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例1
    • 提示
    • 参考答案
  • 五、路标设置
    • 题目描述
    • 输入描述
    • 输出描述
    • 样例1
    • 提示
    • 参考答案

一、愤怒的羊驼

题目描述

动物园来了 C C C 只羊驼,为此动物园需要建造一个有 N N N 个隔间的棚子,这些隔间分布在一条直线上,坐标是 x 1 , x 2 , x 3 , . . . , x n x_1,x_2,x_3,...,x_n x1,x2,x3,...,xn。羊驼在隔间的位置分布必须合理,不然羊驼会认为自己处于危险之中,开始互相吐口水来保护自己,那整个动物园将会臭气熏天!所以为了让羊驼感到安全,在把它们安置在指定的隔间时,所有羊驼中相邻两只的最近距离越大越好。那么,这个最大的最近距离是多少?

输入描述

第一行,两个整数 N , C N,C N,C
第二行, N N N 个整数,表示每个隔间的坐标。

输出描述

输出只有一行,即相邻两只羊驼最大的最近距离。

样例1

输入

5 3
1 2 8 4 9

输出

3

提示

2 ≤ C ≤ N ≤ 1 0 5 2≤C≤N≤10^5 2CN105
0 ≤ x i ≤ 1 0 9 0≤x_i≤10^9 0xi109

参考答案

#include <iostream>
#include <algorithm>
using namespace std;int N, C;
int mid;
int pos[100005];// 按照当前的距离 mid,计算是否能放下 c 只羊驼
bool check(int mid)
{int cnt = 1;  // 记录放羊驼的数量int prev = pos[1];  // 记录第一个隔间的位置// 依次遍历第二到第n个隔间for (int i = 2; i <= N; i++){// 如果下一个隔间到当前隔间的距离大于等于 midif (pos[i]-prev >= mid){cnt++;  // 可以放一只羊驼,记录数量prev = pos[i];  // 更新当前隔间的位置为下一个隔间}}// 返回当前距离 mid 是否能够放下 c 只羊驼return (cnt >= C);
}int main()
{// 输入cin >> N >> C;for (int i = 1; i <= N; i++){cin >> pos[i];}sort(pos+1, pos+N+1);  // 将隔间位置从小到大排序int l = 1;  // 最小距离为1int r = pos[N] - pos[1];  // 最大距离为最后一个隔间位置减去第一个隔间位置int ans = 0;// 二分查找最大的最近距离while (l <= r){mid = (l+r) / 2;if (check(mid)){ans = mid;l = mid+1;}else{r = mid-1;}}// 输出最近距离cout << ans;return 0;
}

二、偷吃西瓜

题目描述

深蓝的天空中挂着一轮金黄的圆月,下面是海边的沙地,都种着一望无际的碧绿的西瓜…闰土看管着 N N N 个瓜田,第 i i i 块瓜田中有 a i a_i ai 个西瓜。今天闰土被父亲叫走帮忙了,将在 H H H 小时后回来。
猹吃西瓜的速度为 K K K(单位:个/小时)。每个小时,猹会选择一块瓜田,从中吃掉 K K K 个西瓜。如果这片瓜田少于 K K K 个,猹会吃掉这片瓜田所有的西瓜,然后这一小时内不会再吃更多的西瓜。
如果猹想在闰土回来前吃掉所有的西瓜,那么需要计算在 H H H 小时内吃掉所有西瓜的最小速度 K K K K K K为整数)。

输入描述

第一行为两个整数 N , H N,H N,H
第二行为 N N N 个整数 a i a_i ai,第 i i i 块瓜田中有 a i a_i ai 个西瓜。

输出描述

一个整数,可以在 H H H 小时内吃掉所有西瓜的最小速度 K K K

样例1

输入

4 8
3 6 7 11

输出

4

提示

1 ≤ N ≤ 1 0 6 1≤N≤10^6 1N106
N ≤ H ≤ 1 0 9 N≤H≤10^9 NH109
1 ≤ a i ≤ 1 0 9 1≤a_i≤10^9 1ai109

参考答案

#include <iostream>
using namespace std;int N, H;
int ans;
int a[1000005];// 检查当前速度 mid 是否可以在 H 小时内吃完
bool check(int mid)
{long long t = 0;for (int i = 1; i <= N; i++){t += (a[i]+mid-1)/mid;}return (t <= H);
}int main()
{// 输入cin >> N >> H;for (int i = 1; i <= N; i++){cin >> a[i];ans = max(ans, a[i]);}// 二分int l = 1, r = ans;while (l <= r){int mid = (l+r) / 2;if (check(mid)){ans = mid;r = mid-1;}else{l = mid+1;}}// 输出cout << ans;return 0;
}

三、丢沙包

题目描述

A 小时候特别喜欢玩丢沙包游戏,周末休息时,他想找朋友一起玩,并且制定了新的规则,其中有个问题,A 需要帮助。当所有 n n n 个沙包都丢在一条直线上,现在他想从这些沙包里找出 c c c 个,使得距离最近的 2 2 2 个距离最大,A 想知道,最大可以到多少?

输入描述

第一行,两个整数 n , c n,c n,c
第二行, n n n 个整数,分别为这 n n n 个沙包坐标,坐标在 [ 1 , 1 0 9 ] [1,10^9] [1,109] 范围内。

输出描述

仅一个整数,为所求答案。

样例1

输入

5 3
1 2 3 4 5

输出

2

提示

2 ≤ c ≤ n ≤ 1 0 5 2≤c≤n≤10^5 2cn105

参考答案

#include <iostream>
#include <algorithm>
using namespace std;int n, c;
int pos[100005];// 按照当前的距离 mid 计算是否能丢 c 只沙包
bool check(int mid)
{// 记录第一个沙包的位置和放沙包的数量int prev = pos[1];int cnt = 1;// 遍历第二到第n个位置for (int i = 2; i <= n; i++){// 如果下一个位置到当前位置的距离 >= midif (pos[i] - prev >= mid){cnt++; // 下一个位置可以丢一个沙包prev = pos[i]; // 更新当前的位置为下一个位置}}// 返回当前距离 mid 是否能够丢 c 个沙包return (cnt >= c);
}int main()
{// 输入cin >> n >> c;for (int i = 1; i <= n; i++){cin >> pos[i];}// 二分sort(pos+1, pos+n+1);int mid, ans = 0;int l = 1, r = pos[n]-pos[1];while (l <= r){mid = (l+r) / 2;if (check(mid)){ans = mid; // 更新答案l = mid+1; // 搜索更大的距离}else{r = mid-1; // 减小距离}}// 输出cout << ans;return 0;
}

四、木材加工

题目描述

木材厂有 n n n 根原木,现在想把这些木头切割成 k k k 段长度均为 l l l 的小段木头(木头有可能有剩余)。并且,我们希望得到的小段木头越长越好,请求出 l l l 的最大值。
木头长度的单位是 c m cm cm,原木的长度都是正整数,我们要求切割得到的小段木头的长度也是正整数。
例如有两根原木长度分别为 11 11 11 21 21 21,要求切割成等长的 6 6 6 段,很明显能切割出来的小段木头长度最长为 5 5 5

输入描述

输入文件名为 wood.in
第一行是两个正整数 n , k n,k n,k,分别表示原木的数量,需要得到的小段的数量。
接下来 n n n 行,每行一个正整数 L i L_i Li,表示一根原木的长度。

输出描述

输出文件名为 wood.out
仅一行,即 l l l 的最大值。
如果连 1 c m 1cm 1cm 长的小段都切不出来(好吧,有亿一个样例是这样的),输出 0 0 0

样例1

输入

3 7
232
124
456

输出

114

提示

对于 100 % 100\% 100% 的测试数据, 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1n105 1 ≤ k ≤ 1 0 8 1≤k≤10^8 1k108 1 ≤ L i ≤ 1 0 8 1≤L_i≤10^8 1Li108

参考答案

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;int n, k;
int len[100005];// 判断当前长度 mid 能切段数是否满足要求段数 m
bool check(int mid)
{// 记录切割得到的小段数量int cnt = 0;for (int i = 1; i <= n; i++){cnt += len[i]/mid;}// 判断是否可以切出return (cnt >= k);
}int main()
{freopen("wood.in", "r", stdin);freopen("wood.out", "w", stdout);// 输入cin >> n >> k;for (int i = 1; i <= n; i++){cin >> len[i];}// 二分sort(len+1, len+n+1);int mid, ans;int l = 1, r = len[n];while (l <= r){mid = (l+r) / 2;if (check(mid)){ans = mid;l = mid+1; // 继续搜索更大的 l}else{r = mid-1; // 减小 l}}// 输出cout << ans;fclose(stdin);fclose(stdout);return 0;
}

五、路标设置

题目描述

B 市和 T 市之间有一条长长的高速公路,这条公路的某些地方设有路标,但是大家都感觉路标设得太少了,相邻两个路标之间往往隔着相当长的一段距离。为了便于研究这个问题,我们把公路上相邻路标的最大距离定义为该公路的"空旷指数"。现在政府决定在公路上增设一些路标,使得公路的"空旷指数"最小。他们请求你设计一个程序计算能达到的最小值是多少。请注意,公路的起点和终点保证已设有路标,公路的长度为整数,并且原有路标和新设路标都必须距起点整数个单位距离。

输入描述

1 1 1 行包括三个数 L , N , K L,N,K L,N,K,分别表示公路的长度,原有路标的数量,以及最多可增设的路标数量。
2 2 2 行包括递增排列的 N N N 个整数,分别表示原有的 N N N 个路标的位置。路标的位置用距起点的距离表示,且一定位于区间 [ 0 , L ] [0, L] [0,L] 内。

输出描述

输出 1 1 1 行,包含一个整数,表示增设路标后能达到的最小"空旷指数"值。

样例1

输入

101 2 1
0 101

输出

51

提示

公路原来只在起点和终点处有两个路标,现在允许新增一个路标,应该把新路标设在距起点 50 50 50 51 51 51 个单位距离处,这样能达到最小的空旷指数 51 51 51
2 ≤ N ≤ 1 0 5 2≤N≤10^5 2N105 0 ≤ K ≤ 1 0 5 0≤K≤10^5 0K105 0 < L ≤ 1 0 7 0<L≤10^7 0<L107

参考答案

#include <iostream>
using namespace std;int ans;
int maxn;
int l, n, k;
int a[100005];int check(int mid)
{int cnt = 0;for (int i = 2; i <= n; i++){int tmp = a[i]-a[i-1];while (tmp > mid){tmp -= mid;cnt++;}}return (cnt <= k);
}int main()
{// 输入cin >> l >> n >> k;for (int i = 1; i <= n; i++){cin >> a[i];maxn = max(maxn, a[i]-a[i-1]);}// 二分int mid;int l = 1, r = maxn;while (l <= r){mid = (l+r) / 2;if (check(mid)){ans = mid;r = mid-1;}else{l = mid+1;}}cout << ans;return 0;
}

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

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

相关文章

Go语言之GORM框架(四)——预加载,关联标签与多态关联,自定义数据类型与事务(完结篇)

前言 本来是想着写多表关系的&#xff0c;不过写了一半发现重复的部分太多了&#xff0c;想了想与其做一些重复性工作&#xff0c;不如把一些当时觉得抽象的东西记录一下&#xff0c;就当用一篇杂记完成专栏的最后一篇文章吧。 预加载 简单示例 预加载主要用于在多表关系中…

谷歌浏览器的平替,内置开挂神器,我已爱不释手!

油猴浏览器正式版是一款基于谷歌Chromium源码开发的浏览器&#xff0c;它集成了集成了强大的油猴扩展&#xff08;Tampermonkey&#xff09;&#xff0c;使得用户可以轻松安装各种脚本&#xff0c;从而增强网页浏览体验。提供了一个更加个性化和高效的浏览体验。 油猴扩展&…

git使用流程

1.下载git 搜索下载 2.注册github账号&#xff08;打开爬墙工具&#xff09; 创建一个仓库 3.配置邮箱和密码 4.所以找一个文件夹 鼠标右键 选择 open Git Bash here&#xff08;当前文件夹下打开命令行&#xff09; 输入命令 配置用户名和邮箱 5.将建的仓库克隆下来 …

【JS实战案例汇总——不定时更新版】

一&#xff1a;转换时间案例 1 需求&#xff1a; 用户输入秒数&#xff0c;系统会自动将秒数转变为小时、分钟、秒&#xff0c;并且不满10的要在前面补零 2 算法&#xff1a; 小时:hour parseInt(总秒数/60/60%24) 分钟:minute parseInt(总秒数/60%60) 秒数:second pa…

测试基础09:缺陷(bug)生命周期、定位方式和管理规范

课程大纲 1、缺陷&#xff08;bug&#xff09;生命周期 2、缺陷&#xff08;bug&#xff09;提交规范 2.1 宗旨 简洁、清晰、可视化&#xff0c;减少沟通成本。 2.2 bug格式和内容 ① 标题&#xff1a;一级功能-二级功能-三级功能_&#xff08;一句话描述bug&#xff1a;&…

---初始Linux---

一、认识计算机 计算机 硬件 软件 硬件&#xff1a;就是计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称&#xff08;CPU\GPU\...&#xff09; 软件&#xff1a;是用户和计算机硬件之间及进行交流的工具 然而一个简单的计算机或者说基本的计算机就是有两大…

浙江大学数据结构MOOC-课后习题-第十讲-排序5 PAT Judge【未完成】

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 这段文字是关于如何生成PAT&#xff08;一种编程能力测试&#xff09;的排行榜的说明。下面是这段文字的中文翻译&#xff1a; 输入说明&#xff1a; 每个输入文件包含一个测试案例。对于每个案例&…

C++ A (1020) : 幂运算

文章目录 一、题目描述二、参考代码 一、题目描述 二、参考代码 #include<bits/stdc.h> using namespace std; typedef long long ll;void qq(ll a, ll b, ll m) {if (a 0) cout << 0 << endl;;ll out 1;a % m;while (b > 0){if (b & 1)//奇数的最…

[AIGC] Vue2与Vue3的主要区别和示例代码

Vue3是Vue框架的最新版本&#xff0c;它在性能、开发体验和代码体积等方面都有很大的改进。接下来我们将通过比较Vue2和Vue3的主要区别&#xff0c;进一步理解这些改变是如何影响我们的。 文章目录 一、性能提升二、Composition API三、更好的类型支持四、生命周期钩子函数变化…

lux和ffmpeg进行下载各大主流自媒体平台视频

1、lux下载&#xff0c;链接&#xff1a;https://pan.baidu.com/s/1WjGbouL3KFTU6LeqZmACpA?pwdagpp 提取码&#xff1a;agpp 2、ffmpeg下载&#xff0c;跟lux放在同一个目录&#xff1b; 3、为lux、ffmpeg设置环境变量&#xff1b; 4、WINR&#xff0c;打开运行&#xff0…

带你自学大语言模型系列 —— 前言

今天开始&#xff0c;我计划开启一个系列 《带你自学大语言模型》&#xff0c;内容也已经准备了一段时间了。 该系列的落脚点是“自学”和“大语言模型”&#xff0c;二者不分伯仲&#xff0c;这也是本系列和其他技术文章不一样的地方。 至于原因&#xff0c;我不想只做大语言…

【C++】STL中vector常见功能的模拟实现

前言&#xff1a;在上一篇中我们讲到了Vector的一些常见功能的使用方式&#xff0c;今天为了进一步的去学习Vector和能够更深度的去理解Vector的一些底层的原理。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &…

鸿蒙ArkTS声明式开发:跨平台支持列表【禁用控制】 通用属性

禁用控制 组件是否可交互&#xff0c;可交互状态下响应[点击事件]、[触摸事件]、[拖拽事件]、[按键事件]、[焦点事件]和[鼠标事件]。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到…

【一刷《剑指Offer》】面试题 30:最小的 k 个数

牛客对应题目链接&#xff1a;最小的K个数_牛客题霸_牛客网 (nowcoder.com) 力扣对应题目链接&#xff1a;LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 核心考点 &#xff1a; topK 问题。 一、《剑指Offer》内容 二、分析题目 1、排序&#xff08;O(Nlo…

接口interfance的基本使用

一.为什么有接口&#xff1f; 接口:就是一种规则。 二.接口的定义和使用 1.接口用关键字interface来定义 public interface 接口名{} 2.接口不能实例化 3.接口和类之间是实现关系,通过implements关键字表示 4.接口的子类(实现类) 注意1&#xff1a; 接口和类的实现关系…

43.自定义线程池(一)

ThreadPool是线程池&#xff0c;里面是一定数量的线程&#xff0c;是消费者。 BlockingQueue阻塞队列&#xff0c;线程池中的线程会从阻塞队列中去拿任务执行。任务多了线程池处理不过来了&#xff0c;就会到Blocking Queue中排队&#xff0c;等待执行。链表结构&#xff0c;特…

Netfilter/iptables

1. Netfilter组件图 https://en.wikipedia.org/wiki/Netfilter 其中&#xff1a; etables作用于数据链路层&#xff0c;arptables针对ARP, iptables/ip6tables针对IP层。 nftables 是新的包过滤组件. nft是相对应的新的用户态组件&#xff0c;用于替换etables,arptables,ipt…

从tensorflow导入EarlyStopping能运行但是一直提示未解析

在pycharm中导入早停机的库时&#xff0c;碰上一个问题 from tensorflow.keras.callbacks import EarlyStopping这一条代码中&#xff0c;EarlyStopping一直有个红色波浪线&#xff0c;代表着找不到这个库&#xff0c;提示未解析啥的。 但是运行是可以运行的&#xff0c;虽然可…

GPT-4o如何重塑AI未来!

如何评价GPT-4o? 简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 GPT-4o似乎是一个针对GPT-4模型进行优化的版本&#xff0c;它在性能、准确性、资源效率以及安全和…

Anolis OS 8.9安装Linux 服务器运维管理面板“1Panel”

一、简介 1.Linux 服务器运维管理面板“1Panel” 使用go语言编写 2.很多的项目的应用都是采用 docker 技术来实现&#xff0c;这让 Linux 服务器的运维管理更简单、更安全。 3.1Panel 采纳最新的前端技术&#xff0c;并通过精心设计的UX 交互&#xff0c;为用户提供更好的用户…