二分大體總結

2021-10-23 09:57:41 字數 3375 閱讀 4412

二分的題目由於其方式的特殊性,一般能夠二分出來的結果基本上是不會發生超時情況,但是我們需要注意的是二分的物件問題,就是我們應該對什麼東西來進行二分。這是我們理解分析二分題目的重中之重。

這個題應該算是二分當中比較基礎的一道題目,非常簡單,我們二分的目標主要就是答案,我們需要砍樹的高度就是我們需要去求得的結果,然而這個結果有乙個區間,區間顯然是0 ——這群樹的最高高度。

然後通過二分答案區間組來快速求得答案。

這道題也應該算是比較經典的一道題目,我們需要通過二分定義答案區間,這個題需要注意的是二分時while迴圈的條件

這個題目很有意思,我們二分的是我們所需要的答案,但是我們需要將我們求得答案的區間進行壓縮,右區間顯然是全部數值相加的和,左區間應該是我們的全部陣列中每個元素的最大值.然後通過二分求得該答案是否可行。二分的時候在check函式裡面,我們可以定義乙個數,來對每乙個已經達到我們測試的值進行分裝。

本題需要注意的基本點與前面三個結合起來比較像

下面附上ac**

伐木工人公尺爾科需要砍倒m公尺長的木材。這是乙個對公尺爾科來說很容易的工作,因為他有乙個漂亮的新伐木機,可以像野火一樣砍倒森林。不過,公尺爾科只被允許砍倒單行樹木。

公尺爾科的伐木機工作過程如下:公尺爾科設定乙個高度引數h(公尺),伐木機公升起乙個巨大的鋸片到高度h,並鋸掉所有的樹比h高的部分(當然,樹木不高於h公尺的部分保持不變)。公尺爾科就行到樹木被鋸下的部分。

例如,如果一行樹的高度分別為20,15,10和17,公尺爾科把鋸片公升到15公尺的高度,切割後樹木剩下的高度將是15,15,10和15,而公尺爾科將從第1棵樹得到5公尺,從第4棵樹得到2公尺,共得到7公尺木材。

公尺爾科非常關注生態保護,所以他不會砍掉過多的木材。這正是他為什麼盡可能高地設定伐木機鋸片的原因。幫助公尺爾科找到伐木機鋸片的最大的整數高度h,使得他能得到木材至少為m公尺。換句話說,如果再公升高1公尺,則他將得不到m公尺木材。

輸入格式

第1行:2個整數n和m,n表示樹木的數量(1<=n<=1000000),m表示需要的木材總長度(1<=m<=2000000000)

第2行:n個整數表示每棵樹的高度,值均不超過1000000000。所有木材長度之和大於m,因此必有解。

輸出格式

第1行:1個整數,表示砍樹的最高高度。

樣例輸入:

5 20

4 42 40 26 46

樣例輸出:

36ac**:

#include

#include

using

namespace std;

const

int n =

1000010

;int q[n]

;int n;

long

long m;

bool

check

(int x)

intmain()

cout << r;

return0;

}

ax^3 + bx^2 + cx + d;

輸入格式

一行,4個實數a,b,c,d

輸出格式

一行,3個實根,並精確到小數點後2位。

樣例輸入:

1 -5 -4 20

樣例輸出:

-2.00 2.00 5.00

ac**:

#include

#include

using

namespace std;

float a, b, c, d, mid;

float

res(

float x)

//int

main()

if(res(mid)

<

0.1)

}else

continue;}

return0;

}

對於給定的乙個長度為n的正整數數列a,現要將其分成 m段,並要求每段連續,且每段和的最大值最小。

輸入格式

第 1 行包含兩個正整數 n,m

第 2 行包含 n 個空格隔開的非負整數 a_i

​ ,含義如題目所述。

輸出格式

乙個正整數,即每段和最大值最小為多少。

輸入樣例:

5 34 2 4 5 1

輸出樣例:

6ac**:

#include

using

namespace std;

const

int n =

1000100

;int m, n;

int q[n]

;bool

check

(long

long x)

s += q[i];if

(num >= m)

return

false;}

return

true;}

intmain()

long

long l = max, r = sum, mid;

while

(l < r)

cout << l;

return0;

}

有 n 條繩子,它們的長度分別為 l_i。如果從它們中切割出 k 條長度相同的繩子,這k 條繩子每條最長能有多長?答案保留到小數點後 2 位(直接捨掉 2 位後的小數)。

輸入格式

第一行兩個整數 n 和 k,接下來 n 行,描述了每條繩子的長度 l_i。

輸出格式

切割後每條繩子的最大長度。答案與標準答案誤差不超過 0.010.01 或者相對誤差不超過 1%1% 即可通過。

輸入樣例:

4 11

8.02

7.43

4.57

5.39

輸出樣例:

2.00

ac**

#include

#include

#include

using

namespace std;

const

int n =

10010

;int n, k;

float q[n]

;bool

check

(float x)

if(num >= k)

return

true;}

return

false;}

intmain()

if(l >=

0.98

&& l <=

1.00

) l +

=0.01

;printf

("%.2f"

, l)

;return0;

}

二分查詢各種情況大總結

本文 二分查詢多次刷題時遇到,雖然每次也能寫對,但花了蠻多時間,沒好好想過。而且網上的太多版本,並不是很簡潔,而且邊界條件變化情況太多,容易混淆,下面是自己對二分查詢的一些思考和總結,盡量寫得簡單易懂。三種基本版本 1.1 二分查詢原始版 查詢某個數的下標 任意乙個 在有序陣列中查詢某個數,找到返回...

二分查詢總結

今天上csdn,發現一篇關於二分查詢演算法的文章被置頂,回帖也相當熱烈。我覺得演算法總重要的還是要了解思想,至於程式設計技巧則是其次。二分查詢在計算中演算法中的重要性不言而喻,許多變形的演算法都是基於此演變的,比如二分查詢樹等。所以此演算法程式我也打算總結一下。當然經典的演算法討論莫過於jon be...

二分演算法總結

討論分為3種,第一種是搜尋佇列中任意我們需求的結果,第三種我們需求佇列中有多個返回第乙個,第四種未我們搜尋佇列中有多個返回最後乙個元素的index。第一種 在一行排好序佇列a中搜尋target,一定有。int binarysearch int a,int n,int target return 1 ...