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 ...