ZBH選講 拍照

2022-03-25 22:20:35 字數 1904 閱讀 5523

【問題描述】

假設這是乙個二次元。

lyk召集了n個小夥伴一起來拍照。他們分別有自己的身高hi和寬度wi。

為了放下這個**並且每個小夥伴都完整的露出來,必須需要乙個寬度為σwi,長度為max的相框。(因為不能疊羅漢)。

lyk為了節省相框的空間,它有了絕妙的idea,讓部分人躺著!乙個人躺著相當於是身高變成了wi,寬度變成了hi。但是很多人躺著不好看,於是lyk規定最多只有n/2個人躺著。(也就是說當n=3時最多只有1個人躺著,當n=4時最多只有2個人躺著)

lyk現在想問你,當其中部分人躺著後,相框的面積最少是多少。

【輸入格式】

第一行乙個數n。

接下來n行,每行兩個數分別是wi,hi。

【輸出格式】

你需要輸出這個相框的面積最少是多少。

【樣例輸入】

33 1

2 24 3

【樣例輸出】

27【樣例解釋】

如果沒人躺過來,需要27的面積。

我們只要讓第1個人躺過來,就只需要21的面積!

【資料規模與約定】

對於30%的資料n<=10。

對於60%的資料n<=1000,wi,hi<=10。

對於100%的資料1<=n,wi,hi<=1000。

題解:

①先去掉乙個限制,方法是列舉最大高度h,貪心分類討論:

·貪心策略:在高度不超過限制的情況下,使寬度增加盡可能少。

設h,w分別為當前人的高和寬,那麼:

(1)h>h:

w>h:躺著還是會超出高度,不合法直接跳出。

w<=h:躺著

(2)h<=h:

h>=w:站著(這樣寬度增加得少)

h

因此特殊處理這種需要決策的情況(在h<=h&&h

問題:這些人站著躺著的高度都不會超出h,因此考慮怎樣選擇使得總寬度最少。

解決方案:先讓每個人都站著,此時總寬度設為w,然後再讓n/2個人躺下:

每個人躺下,那麼這個人對w將加上值(h-w) (意思是將寬換成高的長),

那麼我們希望(h-w)盡量小,因此從小到大排序然後取前n/2個躺著就可以了。

#include #include #include #include #include #include #include #include #include #include using namespace std;

set::iterator sit;

int ans,sum,p[1005],i,a[1005],b[1005],cnt,cnt,j,ans,n;

int cmp(int i,int j)

bool flag;

int main()

else

if (b[j]>i) else

if (!flag) continue;

if (cnt>n/2) continue;

sort(p+1,p+cnt+1,cmp);

for (j=1; j<=min(n/2-cnt,cnt); j++) sum-=p[j];

ans=min(ans,sum*i);

}cout<每當我在路上停下腳步,望著天空我都會看到你。

每當我從荒蕪的夢中驚醒,留著眼淚我都能感覺到你。————汪峰《母親》

線段樹選講

線段樹選講 線段樹是一種二叉搜尋樹 與區間樹 相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中的每乙個非葉子節點 a,b 它的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 因此線段樹是平衡二叉樹 最後的子節點數目為n,即整個線段區...

樹狀陣列選講

樹狀陣列 binary indexed tree bit fenwick tree 是乙個查詢和修改複雜度都為log n 的資料結構。主要用於查詢任意兩位之間的所有元素之和,但是每次只能修改乙個元素的值 經過簡單修改可以在log n 的複雜度下進行範圍修改,但是這時只能查詢其中乙個元素的值。樹狀陣列...

CodeChef題目選講

關鍵點 不超過7條 根據咕咕原理,所以答案最少是n 7 n小於49就暴力 隨機化找兩個點判斷直線上的點個數,隨機500次,概率就很高了 法二 點數大於50,答案至少是8 答案一定是7條路之一 隨機找7個點,按照級角序排序,點數大於7的直線就刪去上面的點 之後random不考慮,但是實際上不能真刪除,...