二分簡單入門

2021-08-19 14:27:20 字數 1086 閱讀 6327

參考文章:

二分.1.最大化最小值:

相當於n個東西分給m個人,使得每個人

至少拿x個

,那麼每個人拿夠了

就走,給後面的人多留一點,只要能分夠

>=m個人

就是true,多的全

扔給最後乙個人就是了.

2.最小化最大值:

相當於n個東西分給m個人,每個人

至多能拿x個

,那麼每個人盡可能

多拿一點,給後面的人少留一點,只要能使

<=m個人

分完這n個東西

就是true,之後每個人隨便拿一點給沒有拿到的人就是了.

總結一下最大值最小化的思路

其實覺得這種演算法蠻有現實意義的,給一堆亂七八糟的東西分堆,分出來的每堆都不超過乙個固定的數值,這是要有技術含量的。

1.即首先求出二分的上下限,這個是每次二分必做的準備工作,上限即為這一堆東西的總量,下限即單個最大的物品的值。

2.有上下限之後即開始二分,最難寫的部分就出來了,即判斷當前分堆是否合理,在判斷分堆是否合理中,主要的

限制因素

為兩個,

乙個是單堆的量肯定不能超過當前的mid值,另乙個是分出的堆數一定不能超過題目要求的m值

3.由判斷條件即可將二分範圍進行縮小,即,一旦當前mid值滿足分堆要求,意味著我還可以把mid值縮小,即把二分的right=mid,如果當前mid值觸犯了判斷條件,即說明當前值還太小,即把left=mid+1。

4.由以上二分return出來的結果即為所求值

#include#include#includeusing namespace std;

typedef long long ll;

#define max 100000+5

int num[max],n,m;

bool judge(ll mid)

sum+=num[i];

}return true;

}ll binary(ll maxs,ll sum)

{ ll left=maxs,right=sum,mid;

while(left

我的標籤:做個有情懷的程式設計師。

二分入門題

在乙個遞增的序列裡,查詢元素是否存在,若存在輸出yes,不存在輸出no.本題多組資料,首先輸入乙個數字n,然後輸入n個數,資料保證數列遞增,然後再輸入乙個查詢數字。若存在輸出yes,不存在輸出no.4 1 3 5 8 3 yes include include includeusing namesp...

二分基礎入門

二分查詢 又稱折半查詢,對排好序的陣列,每次取這個數和陣列中間的數進行比較,複雜度是 o logn 如 設陣列為 a n 查詢的數x,如果x a n 2 則返回 n 2 如果 x a n 2 則在 a 0 到a n 2 1 中進行查詢 如果x a n 2 則在a n 2 1 到a n 1 中進行查詢...

二分入門 二分知識 及 幾種情況

二分排序 時間複雜度是 log n 最壞的情況下是 n 乙個條件是帶查詢陣列是有序的,分兩種 一公升序 而降序 主要思路就是指定兩個指標start end 分別指向陣列元素的兩端,然後比較陣列中間的arrat mid 和待查詢元素,n 直接找到某值在右若干個 n時 找n 以下是 若找到中間值是n則輸...