想法:
做Disjoint Set,詳細看底下Code~。
2014年3月4日 星期二
2014年3月3日 星期一
UVa 793 Network Connections
想法:
建disjoint set,把連在一起的電腦放在同一個Set,在判斷兩台電腦是否在同一個Set。具體做法是,
建disjoint set,把連在一起的電腦放在同一個Set,在判斷兩台電腦是否在同一個Set。具體做法是,
- 一開始每台電腦都是一個Set(同時該Set的root就是該台電腦編號)
- 然後要合併兩個Set就先各別找到它們的Root,再從一邊的Root連到另一邊的Root合併成一個Set
- 要判斷兩台電腦是否在同一個Set也是分別找Root,如果Root一樣表示這兩台電腦在同一個Set。
2014年3月2日 星期日
POJ 2431 Expedition
題意:
一群牛從起點要出發到城鎮(目的地)距離共L單位,每走一單位同時消耗一單位的油,一開始油箱有P單位的油量,路途中會經過幾個加油站,每個加油站會給兩個數字,1.距離城鎮多少單位,2.這個加油站能加多少油,本題問到目的最少要到幾個加油站加油,如果不可能到達目的地則輸出-1。
想法:
因為所有地點都在同一直線上,所以都會經過每個加油站,只是看要不要停下來加油而已。所以我們就盡可能往前走,把每個路過加油站的該站的加油量放到priority queue裡面,然後直到走到途中沒油了,就從priority queue裡面拿出第一個(最大的加油量)加到自己的油箱,因為既然要加油,就要一次加最多的油,一直反覆這個動作直到終點。
一群牛從起點要出發到城鎮(目的地)距離共L單位,每走一單位同時消耗一單位的油,一開始油箱有P單位的油量,路途中會經過幾個加油站,每個加油站會給兩個數字,1.距離城鎮多少單位,2.這個加油站能加多少油,本題問到目的最少要到幾個加油站加油,如果不可能到達目的地則輸出-1。
想法:
因為所有地點都在同一直線上,所以都會經過每個加油站,只是看要不要停下來加油而已。所以我們就盡可能往前走,把每個路過加油站的該站的加油量放到priority queue裡面,然後直到走到途中沒油了,就從priority queue裡面拿出第一個(最大的加油量)加到自己的油箱,因為既然要加油,就要一次加最多的油,一直反覆這個動作直到終點。
2014年3月1日 星期六
UVa 11995 I Can Guess the Data Structure
想法:
既然C++提供STL了,那就直接拿來用,模擬實際情況,但取値或pop()的時候要注意該Container是否為empty,否則會Runtime Error。
UVa 10821 Constructing BST
想法:
在最上層的時候,假設我們有數列{1,2,3,4,5,6,7},要選出一個數字當作該層的root,例如選擇'4',那麼{1,2,3}就被分配到左子樹,{4,5,6}到右子樹,到下一層我們一樣從{1,2,3}和{4,5,6}選出各自的root,然後繼續到下一層。
但題目有說輸出要盡可能小,所以選擇root的時候,要盡可能選靠左邊的數字,所以要讓右子樹填滿,例如現在最上層數列為{1,2,3,4,5,6},深度H=3,代表子樹深還有2,則左右子樹各別能提供(2^2-1=3)3個空間,因此我們選擇'3'當作root,分成{1,2}和{4,5,6}到左右子樹,讓右子樹3個空間被填滿,一直遞迴下去直到分配完全部數字。
在最上層的時候,假設我們有數列{1,2,3,4,5,6,7},要選出一個數字當作該層的root,例如選擇'4',那麼{1,2,3}就被分配到左子樹,{4,5,6}到右子樹,到下一層我們一樣從{1,2,3}和{4,5,6}選出各自的root,然後繼續到下一層。
但題目有說輸出要盡可能小,所以選擇root的時候,要盡可能選靠左邊的數字,所以要讓右子樹填滿,例如現在最上層數列為{1,2,3,4,5,6},深度H=3,代表子樹深還有2,則左右子樹各別能提供(2^2-1=3)3個空間,因此我們選擇'3'當作root,分成{1,2}和{4,5,6}到左右子樹,讓右子樹3個空間被填滿,一直遞迴下去直到分配完全部數字。
UVa 10954 Add All
想法:
這題不是單純由小加到大,考慮 4 5 5 6 7 這數列,4+5+5=14之後,應該要做6+7=13,之後再做13+14=27。
因此每次都選擇兩個最小的數字相加,然後變成一個數字,然後丟回數列裡面,重複至數列只剩一個數字。
借這題順便練習一下priority_queue,它有三個參數priority_queue<type, container, function>,container有兩種,可以用vector<>和deque<>,function也有兩個,less<>將最大的元素放在top,greater<>將最小的元素放在top。
這題不是單純由小加到大,考慮 4 5 5 6 7 這數列,4+5+5=14之後,應該要做6+7=13,之後再做13+14=27。
因此每次都選擇兩個最小的數字相加,然後變成一個數字,然後丟回數列裡面,重複至數列只剩一個數字。
借這題順便練習一下priority_queue,它有三個參數priority_queue<type, container, function>,container有兩種,可以用vector<>和deque<>,function也有兩個,less<>將最大的元素放在top,greater<>將最小的元素放在top。
訂閱:
文章 (Atom)