演算法競賽入門與高階 (四)二分

2021-08-19 10:29:56 字數 1591 閱讀 1457

在乙個單調有序的集合中查詢元素,每次將集合分為左右兩部分,

判斷解在哪個部分中並調整集合上下界,重複直到找到目標元素。

例如:在以下序列中查詢55

binary_search 返回bool值 判斷查詢元素是否存在

lower_bound 返回可插入的最小位置的迭代器

即返回第乙個符合條件的元素位置

upper_bound返回可插入的最大位置的迭代器

即返回最後乙個符合條件的元素位置

給一串n個單調遞增的數,有q次詢問》=x且<=y的數有多少個

資料規模:1 ≤ n ≤ 10^5  1 ≤ q ≤ 50000

c++版

#include#includeusing namespace std;

const int max=1e5+5;

int a[max],n,q;

int main()

//sort(a,a+n);

while(q--)

return l;

}int main()

while (q--)

return 0;

}

//uva1152  poj2785

題意:給你n行4列的數,從每一列選乙個數,

問使他們的和為0的情況有多少種(n<=4000)

思路:既然有四列,那麼我們可以分別計算前兩列和後兩列的和(只需要n*n*2次運算),

然後對後兩列的和排序,那麼我們對於每乙個前兩列的和都可以二分找到後兩列的和中與之相加為0的個數,

這樣的複雜度就是o(n*n*log(n))是可以接受的

c++

#includeusing namespace std;

int main()

vectorab;

for(int i=0;icd;

for(int i=0;i0) cout

#include#includeusing namespace std;

#define n 4010

int a[n],b[n],c[n],d[n];

int ab[n*n],cd[n*n];

int main()

} //sort(ab,ab+t*t);

sort(ab,ab+k);

for(i=0;i<=t*t-1;i++)

else if(ab[mid]+cd[i]>0)

right=mid;

else if(ab[mid]+cd[i]<0)

left=mid;

}if(ab[right]+cd[i]==0&&flag==0)

n++;

if(ab[left]+cd[i]==0&&flag==0)

n++;

} printf("%d\n",n);

return 0;

}

演算法競賽入門與高階 (三)貪心

有n個人在乙個水龍頭前排隊接水,假如每個人接水的時間為ti,請程式設計找出這n個人排隊的一種順序,使得n個人的平均等待時間最小。貪心策略 第1個人的等待時間為0,第二個人的等待的時間為t 1 第三個人的等待時間為t 1 t 2 第n個人的等待時間為前n 1個人接水的時間之和,所以將n個人的接水時間從...

演算法競賽高階指南 分形之城

題目鏈結 把左上角的座標看做 0 0 右上角的座標為 0,2 n 1 左下角的座標為 2 n 1,0 右下角座標為 2 n 1,2 n 1 街區的標號也從 0 開始。現在對於給定的兩個距離,我們要分別求出他們的座標。現在給出等級為 2 距離為 10 如何求座標呢?等級為 1 的城市中有 4 座街區,...

ACM 演算法 二分法 資訊競賽高階指南 二分法

寫在前面 我們主要還是分享演算法的模板,而不是去刨析演算法的原理!定義 二分答案是指在答案具有單調性的前提下,利用二分的思想列舉答案,將求解問題轉化為驗證結果。流程 首先需要估計答案的上下界,然後不斷取區間中點進行驗證 這就要求答案的驗證應當簡單可行 並通過驗證結果不斷更新答案區間,最終得到答案。不...