## UVA 11063 - B2-Sequence ### 題意: ###### 判斷這個數列是不是B2-Sequence ###### B2-Sequence: ###### 1. 為嚴格遞增數列,且每個數字皆大於0 ###### 2. 數列中任兩個數字相加後的值不重複 (要注意:==包含自己加自己==) ###### e.g. 1, 2, 3 不為B2-Sequence,因為 1+3 = 2+2 (重複了!) ### Sample Input: ###### 1. 第一行代表這個數列有幾個數字 ###### 2. 第二行是這個數列 ###### 3. test case之間會用blank line分隔,輸入直到EOF ```= 4 1 2 4 8 4 3 7 10 14 ``` ### Sample Output: ###### 輸出Case #k: 是不是B2-Sequence ###### 這題很佛心的說每個case之後都要一個blank line ###### (我本來以為它會說最後一個case不接blank line,然後就PE了QQ,雖然不是大問題XD) ```= Case #1: It is a B2-Sequence. Case #2: It is not a B2-Sequence. ``` ### 解題思路: ###### 其實就只是在吃資料之前先判斷一下是不是正整數&嚴格遞增,然後把所有測資吃進vector裡面,跑迴圈算兩個數字相加後的值,再餵到set裡面判斷是不是有重複而已XD ### 程式碼: ```cpp= #include <iostream> #include <string> #include <set> #include <vector> #include <sstream> #define haku author using namespace std; int main() { int c = 1, n, tmp; string str; while (getline(cin, str)) { // 這題有趣的是,zeroJudge上面,兩個test case之間是沒有blank line的,但瘋狂程設跟Virtual Judge都有XD // 所以我這樣寫: if (str == "") continue; n = stoi(str); bool b2 = true; vector<int> seq; getline(cin, str); stringstream ss(str); for (int i = 0; i < n; i++) { ss >> tmp; // 判斷吃進來的數字是不是小於1,小於1的話就不是B2-Sequence if (tmp < 1) { b2 = false; break; } // 判斷是不是嚴格遞增數列 if (i > 0 && tmp < seq[i - 1]) { b2 = false; break; } seq.push_back(tmp); } if (b2) { // 用set存兩個數字相加後的值 set<int> pairSum; for (int i = 0; i < seq.size() && b2; i++) { for (int j = i; j < seq.size(); j++) { tmp = seq[i] + seq[j]; // 判斷set裡面是否有重複值,有重複的話就不是B2-Sequence if (pairSum.count(tmp)) { b2 = false; break; } else pairSum.insert(tmp); } } } cout << "Case #" << c << ": "; if (b2) cout << "It is a B2-Sequence." << endl; else cout << "It is not a B2-Sequence." << endl; cout << endl; c++; } return 0; } // by. Haku ```