利用二分思想來尋求解

2021-08-16 08:24:04 字數 1629 閱讀 9555

1.長城守衛(beijing guards,cerc 2004,la3177)

n 個人圍成乙個圈,其中第 i

i 個人想要有 riri

個不同的禮物。 

相鄰的兩個人可以聊天,炫耀自己的禮物。

5 個人,每個人都要乙個禮物,則至少要 3

3 種禮物。 

如果把這 3

3 種禮物編號為 1,2

,31,2,3

,則5個人拿到的禮物應分別是:1,2

,1,2

,31,2,1,2,3。5

種禮物,且 5

5 個人拿到的禮物集合應該是: ,,

,,,,,,。n

; 以下 n

n 行按照圈上的順序描述每個人的需求,其中每行為乙個整數 riri

,表示第 i

i 個人想要 riri

個不同的禮物。 

輸入結束標誌為 n=0

n=0。

%100%

的資料,1≤n

≤1051≤n≤105,1≤

ri≤10

5如果n為1,則答案為r[1];(注意此處的特判)

如果n為偶數,則答案為相鄰的兩個人的r值之和的最大值;

如果n為奇數,:(敲黑板)

假設需要p個禮物,設第乙個人的禮物種類在1~r1,則最優的分配策略為:編號為偶數的人應盡量往前取,編號為奇數的人應盡量往後取。這樣,編號為n的人在不衝突的情況下,盡可能的往後取rn樣東西,最後判定編號為1的人和編號為n的人是否衝突即可。

記錄每個人在【1~r1】的範圍內取幾個,在【r1+1~n】的範圍內取幾個,分別用left和right陣列表示

#include#includeusing namespace std;

const int maxn=100000+10;

int n,r[maxn],le[maxn],ri[maxn];

bool test (int p)

else

}return le[n]==0;

}int main()

{ while(cin>>n&&n!=0)

{ for(int i=1;i<=n;i++)

cin>>r[i];

if(n==1) cout《與此解法相類同的還有:組裝電腦(assemble,nwerc2007,la3971)

b 塊錢,想要組裝一台電腦。給出 n

n 個配件各自的種類、品質因子和**,要求每種型別的配件各買乙個,總**不超過 b

b,且「品質最差配件」的品質因子應盡量大。t(t

≤100

t≤100

)。 每組資料的第一行為兩個正整數 nn(1

≤n≤1000

1≤n≤1000

)和 b(1

≤b≤10

9)b(1≤b≤109)

,即配件的數目和預算; 

以下 n

n 行每行描述乙個配件,依次為種類、名稱、**和品質因子。 

其中,**為不超過 10

6106

的非負整數; 

品質因子是不超過 10

9109

的非負整數(越大越好); 

種類和名稱則又不超過 20

20 個字母、數字和下劃線組成。 

輸入保證總是有解。

2019 08 08 二分思想

今天做了一道二分題 感覺二分仍需要加強 乙個經典題目 求乙個遞增陣列裡某個數字出現次數 我們第一想法 暴力 的確可以 邊讀入邊判斷是否為我們要的那個數 這種複雜度是o n 有沒有更高效演算法呢?二分!我們可以二分查詢陣列中這個數出現的第乙個位置和最後乙個位置 數量不就得出來了嗎 那麼怎麼二分呢?我們...

二分查詢思想

二分查詢思想應用於對有序的陣列進行查詢操作。時間複雜度 二分查詢也稱為折半查詢,每次都能將查詢區間減半,這種折半特性演算法時間複雜度為o logn mid計算 有兩種計算中值mid的方式 l h可能出現加法溢位,也就是說加法的結果大於整形能夠表示的範圍。但是l和h都為正數,因此h l不會出現加法溢位...

二分思想小剖析

這乙個月努力沖一沖,三月份的甲級能考掉就考掉了。今天看演算法筆記看到了二分,想著二分還不簡單。看了看發現並不是?演算法筆記中有一句加粗的話是我以前在二分中從沒聽過的,大部分二分問題可以歸結為 尋找有序序列中第乙個滿足某條件的元素的位置。這句話一開始聽得不明所以,仔細一想別有洞天。比如下面的木棒切割問...