個人筆記 演算法講座4 1 畫板

2021-10-03 22:17:06 字數 1561 閱讀 5206

alice熱愛繪畫,聖誕節時bob送了一塊木板給她,作為她作品牆。以後alice每畫好一幅畫,就用兩個夾子夾在木板的上邊緣欣賞。所有的畫都是矩形的。且不會超出作品牆的範圍。bob也會經常來看看作品牆還剩餘多少面積沒有被覆蓋。一旦剩餘的面積少於原面積的1/2,bob就要去買一塊新的木板了。輸入第一行a、b、n,表示木板的長(上邊緣)、寬和作品數。從第二行開始,每行有三個整數,表示作品的位置和高度。

每次查詢的結論

buy(需要) no(不需要)

畫板的尺寸一定是從 0 cm開始到 n cm

所以 0~1cm 包含在畫板內 n~n+1cm不包含在畫板內 n cm是畫板的最右端刻度,0 cm是畫板的最左端刻度

alice每次將新畫的畫掛在畫板上時可能出現兩種情況

直接覆蓋在畫板上

部分或整體覆蓋在之前掛在畫板上的畫上,此時只需要考慮覆蓋之前和覆蓋之後的畫哪乙個高度更高即可

每輸入一幅畫的資料只需要考慮在當前畫板上,每個單位長度上的值是否小於該畫的高度,小於則輸入,否則不改變

最後會得到畫板上所有畫覆蓋完之後每個單位長度上的高度,沒有覆蓋就是0,覆蓋了就是所覆蓋的畫中最高的那乙個

需要乙個int型的一維陣列painting表示畫板的上邊緣長度。

painting中的每乙個資料都是當前單位長度上被覆蓋的最大高度

乙個f(a,b,v)函式對painting上的資料不斷更新:

a是當前輸入的畫的起始位置,b是當前輸入的畫的終止位置,v是當前輸入的畫的高度。需要乙個if判斷當前輸入的畫的高度是否大於當前畫板上畫的高度,只有大於才能覆蓋

需要乙個sum函式對畫板上每乙個單位長度的畫的高度求和,並將求和結果與畫板面積的一半(a*b/2)進行比較

如果》=則輸出buy,《輸出no

100 20 4

15 42 7

20 80 15

86 90 20

18 70 3

1000 600 6

400 700 350

200 300 100

250 500 200

500 700 200

400 500 400

300 800 200

buy no

#include

#define maxsize 1000000

int painting[maxsize]=;

void

create

(int lchild,

int rchild,

int v)

else

}int

sum(

int a)

intmain

(int argc,

const

char

* ar**)

// int count=0;

// for (int i=0; i<10; i++)

// printf("\n");

// }if(

sum(a)

>a*b/2)

else

return0;

}

個人筆記 演算法講座5 1 積木1

alice在玩樂高積木,這種積木能互相拼接到一起。alice為每塊積木編了號,為1,2,n,她計畫構造乙個複雜的積木世界,因此按順序在圖紙上寫下了需要互相拼接的積木編號。bob看到了這份圖紙,他想搗亂,想把所有的積木拼接成乙個整體,他至少需要準備多少塊積木?資料有t組。每組第一行為n,m,表示這次拼...

個人筆記 演算法講座3 揹包問題及其變種

設計乙個動態規劃問題需要首先搞清楚他的 同質子結構 狀態轉移方程 備忘錄 即動態規劃中動態儲存資料的東西 如果將揹包問題用方程 f w,i 表示 w 為揹包容量,i 為物品個數 則對於每乙個物品,只需要考慮裝入揹包 or 不裝入揹包這兩個情況 對於 f 4,3 9 i 3 weight 8,valu...

《演算法筆記》4 1 總結

本節內容為排序 題目列表 b1015 a1062 a1012 a1016 a1028 a1055 a1075 a1083 a1080 a1095 本節首先介紹了標頭檔案下的排序函式sort sort 函式採用快排實現,並且進行了特殊處理保證能夠規避掉經典快排中可能會實際上退化到o n2 的情況,so...