1. 程式人生 > >積木問題

積木問題

begin 一行 esp 2-2 ins 內存 () 代碼 iterator

(賽碼網的模擬考試題,這道題目挺有意思)

搭積木

時間限制:C/C++語言 1000MS;其他語言 3000MS
內存限制:C/C++語言 65536KB;其他語言 589824KB

題目描述:

一天,小明買了許多積木回家,他想把這些積木拼接在一起。每塊積木有兩個接口,每個接口我們用一個數字標記,規定只有當兩塊積木有相同數字標記的接口時,這兩塊積木才可以通過該接口拼接在一起。舉例,有兩塊積木,接口數字分別為1,2和3,4,那麽這兩塊積木無法拼接;若兩塊積木接口數字分別為1,2和2,3,那麽這兩塊積木可以通過由數字2標記的接口拼接在一起。現在小明知道所有積木的數量和每塊積木接口的數字標記,你能告訴他他可以將所有積木拼接成一個整體麽?

輸入

第一行一個整數t,表示測試數組組數1≤t≤10;
接下來在每組測試數據中:
第一行一個整數n,表示積木的數量1≤n≤100000,
下面n行每行2個整數x,y,表示其中一塊積木的兩個接口的數字標記;1≤x,y≤100000;

輸出

對於每組測試數據,輸出”YES”,表示該組數據中的所有積木可以拼接成一個整體,”NO”表示不行。(註意輸出不包括引號)

樣例輸入

2
3
1 2
2 3
4 5
6
1 2
2 3
3 5
4 5
4 6
5 1

樣例輸出

NO
YES

Hint

在第一組測試數據中,有3塊積木,顯然前兩塊是可以拼接在一起的,但是第3塊無論如何也無法和前兩塊拼接,所以輸出NO;第二組數據中我們可以這樣拼接:5-1-1-2-2-3-3-5-5-4-4-6,因此輸出YES。


思路:

先將每個積木的鍵值對用multimap排序(先都存起來的原因是積木可能亂序,為了排序.註意multimap插入時讓小的標號在前面,因為multimap只針對鍵值排序),然後從頭向尾處理,若可以連接,就更新尾端(由於兩端均可能更新,故用deque維護).如果遇到和deque中兩端數字均不同的積木,即不可鏈接.否則如果走完全部積木,即為可鏈接.

代碼:

 1 /*搭積木
 2 時間限制:C/C++語言 1000MS;其他語言 3000MS
 3 內存限制:C/C++語言 65536KB;其他語言 589824KB
 4 題目描述:
 5 一天,小明買了許多積木回家,他想把這些積木拼接在一起。每塊積木有兩個接口,每個接口我們用一個數字標記,規定只有當兩塊積木有相同數字標記的接口時,這兩塊積木才可以通過該接口拼接在一起。舉例,有兩塊積木,接口數字分別為1,2和3,4,那麽這兩塊積木無法拼接;若兩塊積木接口數字分別為1,2和2,3,那麽這兩塊積木可以通過由數字2標記的接口拼接在一起。
6 現在小明知道所有積木的數量和每塊積木接口的數字標記,你能告訴他他可以將所有積木拼接成一個整體麽? 7 輸入 8 第一行一個整數t,表示測試數組組數1≤t≤10; 9 接下來在每組測試數據中: 10 第一行一個整數n,表示積木的數量1≤n≤100000, 11 下面n行每行2個整數x,y,表示其中一塊積木的兩個接口的數字標記;1≤x,y≤100000; 12 輸出 13 對於每組測試數據,輸出”YES”,表示該組數據中的所有積木可以拼接成一個整體,”NO”表示不行。(註意輸出不包括引號) 14 樣例輸入 15 2 16 3 17 1 2 18 2 3 19 4 5 20 6 21 1 2 22 2 3 23 3 5 24 4 5 25 4 6 26 5 1 27 樣例輸出 28 NO 29 YES 30 31 Hint 32 在第一組測試數據中,有3塊積木,顯然前兩塊是可以拼接在一起的,但是第3塊無論如何也無法和前兩塊拼接,所以輸出NO;第二組數據中我們可以這樣拼接:5-1-1-2-2-3-3-5-5-4-4-6,因此輸出YES。 33 */ 34 35 //思路:先將每個積木的鍵值對用multimap排序(先都存起來的原因是積木可能亂序,為了排序.註意multimap插入時讓小的標號在前面,因為multimap只針對鍵值排序),然後從頭向尾處理,若可以連接,就更新尾端(由於兩端均可能更新,故用deque維護) 36 #include <iostream> 37 #include <map> 38 #include <deque> 39 #include <string> 40 41 using namespace std; 42 43 int main() { 44 int group; 45 cin >> group; 46 while (group--) { 47 string result = "YES"; 48 int n; 49 cin >> n; 50 multimap<int, int> mymap; 51 int tmp1, tmp2; 52 while (n--) { 53 cin >> tmp1 >> tmp2; 54 if (tmp1 <= tmp2) 55 mymap.insert(pair<int, int>(tmp1, tmp2)); 56 else 57 mymap.insert(pair<int, int>(tmp2, tmp1)); 58 } 59 deque<int> judge; 60 multimap<int, int>::iterator it = mymap.begin(); 61 judge.push_back((*it).first); 62 judge.push_back((*it).second); 63 ++it; 64 for (; it != mymap.end(); ++it) { 65 // cout << "judge.size()=" << judge.size() << endl; 66 // cout << "judge[0]=" << judge[0] << "judge[1]=" << judge[1] << endl; 67 if (judge[0] == (*it).first) { 68 judge.pop_front(); 69 judge.push_front((*it).second); 70 } 71 else if (judge[1] == (*it).first) { 72 judge.pop_back(); 73 judge.push_back((*it).second); 74 } 75 else if (judge[0] == (*it).second) { 76 judge.pop_front(); 77 judge.push_front((*it).first); 78 } 79 else if (judge[1] == (*it).second) { 80 judge.pop_back(); 81 judge.push_back((*it).first); 82 } 83 else { 84 result = "NO"; 85 break; 86 } 87 } 88 result = (result == "NO") ? "NO" : "YES"; 89 cout << result << endl; 90 } 91 return 0; 92 }

積木問題