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 0xi?109

參考答案

#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 1ai?109

參考答案

#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 1Li?108

參考答案

#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.pswp.cn/bicheng/21107.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21107.shtml
英文地址,請注明出處:http://en.pswp.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;為用戶提供更好的用戶…