二分的題目由於其方式的特殊性,一般能夠二分出來的結果基本上是不會發生超時情況,但是我們需要注意的是二分的物件問題,就是我們應該對什麼東西來進行二分。這是我們理解分析二分題目的重中之重。
這個題應該算是二分當中比較基礎的一道題目,非常簡單,我們二分的目標主要就是答案,我們需要砍樹的高度就是我們需要去求得的結果,然而這個結果有乙個區間,區間顯然是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 ...