Kattis - Bus Numbers
題目
https://open.kattis.com/problems/busnumbers
給一個序列,如果有連續遞增 $1$ 的子序列 $a_i$ ~ $a_j$ 長度超過 $2$ ,那麼就可以化簡成 a_i-a_j
否則正常輸出每個數字
例如有一個序列 $(141, 142, 143, 145)$ 經過化簡後會變成 141-143 145
想法
可以化簡的是連續遞增的序列,那麼很容易可以想到先將序列排序
排序之後檢查每個連續的子序列長度,若超過 $2$ 就輸出化簡的結果,否則正常輸出即可
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include<iostream> #include<algorithm> using namespace std; int main(){ int n, arr[1010]; bool out=false; cin>>n; for(int i=0 ; i<n ; i++){ cin>>arr[i]; } sort(arr, arr+n); for(int i=1, cnt=1 ; i<=n ; i++){ if(arr[i]-1 == arr[i-1] && i!=n){ cnt++; } else{ if(out) cout<<" "; else out=true; if(cnt>2){ cout<<arr[i-cnt]<<"-"<<arr[i-1]; } else if(cnt==2){ cout<<arr[i-2]<<" "<<arr[i-1]; } else{ cout<<arr[i-1]; } cnt=1; } } cout<<'\n'; return 0; }
|
複雜度分析
輸入時間複雜度為 $O(n)$
排序時間複雜度為 $O(nlogn)$
遍歷時間複雜度為 $O(n)$
總時間複雜度為 $O(n + nlogn)$