HDU 1050 搬椅子 數學

2022-05-09 18:35:39 字數 1677 閱讀 5240

題意是在乙個有 400 個房間的走廊中搬動房間裡的椅子,如果兩次的路線重疊,就要分兩次搬動,如果不重疊,就可以一次搬動。

開始的時候直接當成求線段重疊條數的題,發現這種思路完全是錯的,比如 1 - 3,2 - 4,3 - 5 這一組,只需搬動兩次即可,但找重疊線段的話就會找到 3 條重疊線段。

然後打算直接模擬做,加入一點貪心的思路,用結構體陣列存搬動要求,按椅子搬動的距離從小到大排序,掃瞄一邊整個結構體陣列,將搬動的路徑標記,

若已經標記過,則 ++ans,注意 ans 的初值為 1,因為第一次搬動要算作一次搬動,但這一次沒有與任何路徑重疊。

模擬做的直接超時了......

**如下:

1

int t,n,ans,mp[405];2

boolf;3

struct

node

4p[205];7

bool

cmp(node a,node b)811

intmain()

1224 sort(p,p+n,cmp);

25for(int i = 0; i < n; ++i)

2637}38

if(f) fill(mp+p[i].from,mp+p[i].to,-1

);39

}40 printf("

%d\n

",ans*10

);41}42

return0;

43 }

view code

看了其他人的做法,才知道不應該把房間看作排列在一條線段上的點,而是如題目中描述的那樣排在一對平行線上:

這樣將房間前的位置用乙個長 200 的一維陣列來存,在每次的路徑的每乙個位置上增加 1,這個陣列中的最大值即為搬動次數。如圖示的情況即為:1,2,2,0,...

搬動次數即為 2 次。

**如下:

1 #include 2

using

namespace

std;

3int

main()422

for(int j = (from+1)/2; j <= (to+1)/2; ++j)

23 cnt[j]++;24}

25for(int i = 1; i <= 201; ++i)

26if(anscnt[i];

27 printf("

%d\n

",ans*10

);28}29

return0;

30 }

view code

另外還知道了一點,在交換兩變數的值時,用位運算的方法更快:

如 temp = a; a = b; b = temp;

用位運算實現:a = a^b; b = a^b; a = a^b;

本題中由於沒注意到有可能搬動是從房間號較大的房間搬向房間號較小的房間,還 wa 了......

解決辦法就是再加一步如果是這種情況就交換兩房間的號碼,即還是從小到大的順序,這裡直接交換的結果是 15ms,用位運算交換的結果是 0ms.

以後就要改用這種位運算交換的方法了。

特向這篇部落格的作者致謝:

hdu 1050解題報告

題意 在乙個賓館裡把乙個桌子從乙個房間i移到房間j但是在移動的過程中房間i和房間j之間的走廊會被占用。每一次的移動需要10鐘的時間,問把所有的桌子移動完畢至少需要多長時間。思路 這是一道貪心演算法的題目,把每乙個桌子的移動按起始房間編號排序 這裡規定起始房間的編號小於目的房間的編號 然後採取貪心策略...

動態規劃 hdu 1421 搬寢室

problem description 搬寢室是很累的,xhd深有體會.時間追述2006年7月9號,那天xhd迫於無奈要從27號樓搬到3號樓,因為10號要封樓了.看著寢室裡的n件物品,xhd開始發呆,因為n是乙個小於2000的整數,實在是太多了,於是xhd決定隨便搬2 k件過去就行了.但還是會很累,...

HDU1421 搬寢室 動態規劃

動態規劃題 題意是輸入兩個整數n和k,表示從n件物品中搬走k對 每次左右手各搬一件 已知每件物品的疲勞值,求搬走k對後的最小疲勞度。每個物品的疲勞度用ans存起來,很明顯,把ans按公升序排序後每相鄰兩個物品的疲勞度都是最小的 然後定義陣列dp i j 表示從前i件物品中搬走j對的總疲勞度,則對於第...