二分法應用

2021-08-21 19:41:11 字數 1636 閱讀 3357

eg:poj 2456:瘋牛

#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 1e7 + 10;

ll a[maxn];

ll n, c;

//對距離進行二分

int ans = 0;

int sum = 1;

int main()

en++;

} if (sum >= c)

else

} ans = mid;

cout << ans << endl;

return 0;

}

eg:有n個物品的重量和價值分別是wi和vi,從中選出k個物品使得單位重量價值最大。

樣例(wi,vi)=(2,2) (5,2) (2,1)

解析:這道題不能通過比較單位重量價值去計算,要利用二分思想。

設c(x)為單位重量的價值,滿足c(x)>=x,如果x最大,則c(x)也必然最大,所以我們要做的是利用二分方法找到最大的x。

設w······wj是我們要找的那k個物品,則:

c(x)=(wi+···+wj)/(vi+···+vj)>=x

->wi+···+wj>=(vi+···+vj)*x

->wi+···+wj>=vi*x+···+vj*x

->(wi-vi*x)+···+(wj-vj*x)>=0

所以我們只要在0~inf內尋找滿足上式合法的x,並且令x最大即可。

由於這是乙個線性函式,所以利用二分去尋找最大的x。

eg:有乙個長度為n的數列,一正整數s,求出乙個長度最小的連續子串行,使它們的和》=s

樣例:n=10,s=15;

a=;解析:定義乙個sum=0,然後從左向右加,如果sum>s,則從左側減,如果減完後發現sum<15,則從右側加。

實現過程:sum=0   a=5 1 3 10 7 4 9 2 8   s=15

->右加 5 1                          sum<15

->右加 5 1 3                       sum<15

->右加 5 1 3 5                    sum<15

->右加 5 ,1, 3, 5, 10           sum>15

->左減     1, 3, 5, 10           sum>15

->左減     3, 5, 10                ·······

->左減         5, 10

->左減             10

->右加             10, 7

->左減                   7

->右加                   7, 4

->右加                   7, 4, 9

->左減                       4, 9

綜上:只要sum>15就從左側減,否則從右側加

待更新······

二分法及其應用

二分法,是通過不斷縮小解的可能存在的範圍,從而求得問題的最優解的方法。經常有二分與其他演算法結合的題目。1.從有序陣列查詢某個值 以stl中的lower bound與upper bound為例 lower boud begin,end,val 函式輸入需要查詢的有序數列前閉後開區間,查詢數列中第乙個...

C 二分法查詢,遞迴二分法

用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...

python二分法查詢 Python 二分法查詢

二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...