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