開啟章節選單
10038 Jolly Jumpers
題目連結
題目敘述
長度為 n > 0 的整數序列稱為 jolly jumper,如果該序列相鄰元素之間絕對差值包含了從 1 到 n−1 的所有整數
例如序列
1 4 2 3
是 jolly jumper,因為相鄰元素的絕對差分別為 3、2 和 1,恰好包含了 1 到 3 的所有整數
定義中也隱含,任何單一整數的序列都是 jolly jumper
請撰寫程式判斷輸入的多組序列是否為 jolly jumper
輸入說明
每行輸入包含一個整數 n(n ≤ 3000),接著是 n 個整數,代表該序列的元素
輸出說明
對每組輸入的序列,輸出一行:
- 若該序列為 jolly jumper,輸出
Jolly - 否則輸出
Not jolly
解題思路
建立一個大小為 n 的計數陣列 cnt(初始為 0),用來紀錄差值出現的次數
遍歷序列中相鄰的元素對 (vc[i-1], vc[i]),計算差的絕對值 k = abs(vc[i] - vc[i-1])
若 k 在範圍 [1, n-1] 內,將 cnt[k] 加 1,表示這個差值出現過
遍歷 cnt,檢查從 1 到 n−1 是否都有出現(即 cnt[i] != 0)
- 如果有任何一個值沒出現,代表該序列不是 jolly jumper
- 否則,該序列是 jolly jumper
程式碼
#include <bits/stdc++.h> using namespace std; int main() { int n; while (cin >> n) { vector<int> vc(n), cnt(n); for (int i = 0; i < n; i++) cin >> vc[i]; for (int i = 1; i < n; i++) { int k = abs(vc[i] - vc[i - 1]); if (1 <= k && k < n) cnt[k]++; } bool flag = false; for (int i = 1; i < n; i++) { if (cnt[i] == 0) { cout << "Not jolly" << endl; flag = true; break; } } if (!flag) cout << "Jolly" << endl; } return 0; }