開啟章節選單

11063 B2-Sequence

題目連結

題目敘述

11063 B2-Sequence
B2-數列是一串正整數序列 1 ≤ b1 < b2 < b3 ...,使得所有成對加總 bi + bj(其中 i ≤ j)皆為不同的值。

你的任務是判斷給定的序列是否為 B2-數列。

輸入說明

每組測資以 2 ≤ N ≤ 100 開始,代表序列中的元素數量
下一行會有 N 個整數,代表序列中每個元素的值
每個元素 bi 皆為不超過 10000 的正整數
每組測資之間會有一個空行,輸入以檔案結尾(EOF)作結

輸出說明

對於每組測資,你必須印出測資編號(從 1 開始),以及一段訊息指出該序列是否為 B2-數列
請參考下方的範例輸出
每組測資之後必須印出一個空行

解題思路

進行以下三個條件的判斷 只要違反一項則不是 B2-數列

  1. 首項數值大於等於 1
  2. 數列是否嚴格遞增
  3. 是否每組 bi + bj(其中 i ≤ j)數對和為獨特(不重複)

程式碼

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, T = 0;
    while (cin >> n) {
        vector<int> v(n);
        set<int> st;
        for (auto &i : v) cin >> i;
        int flag = v[0] <= 0; // flag:紀錄是否違反規則
        // 先檢查 v[0] 是否大於等於 1(規則一)
        for (int i = 0; i+1 < n; i++) if (v[i] >= v[i+1]) flag = 1; // 檢查數列是否嚴格遞增(規則二)
        for (int i = 0; i < n; i++) for (int j = i; j < n; j++) { // 檢查數列中每數對和皆不重複(規則三)
            if (st.count(v[i]+v[j])) flag = 1;
            st.insert(v[i]+v[j]);
        }
        cout << "Case #" << ++T << ": It is" << (flag ? " not " : " ") << "a B2-Sequence.\n\n";
    }
}