第一次參加 GCJ,之前一直沒時間完成這個夢想,這次勇敢踏出第一步。
Qualification Round 已經晉級,我檢討並總結自己的 Code,將比較好的寫法整理下來。
第一題 Reversort 很簡單,沒太大的問題。
題目要求實現 Reversort 演算法,Pseudo Code 已經給予,直接依照 Pseudo Code 刻程式碼即可:
Reversort(L):
for i := 1 to length(L) - 1
j := position with the minimum value in L between i and length(L), inclusive
Reverse(L[i..j])
這裡要注意,矩陣 reverse 有既有的函式可以用,以及 Case 輸出 index 是從 1 開始計,而非 0 開始起算。
以下是我總結較好的寫法:
// by EdocZec on 2021/04/03 // Google Code Jam 2021-01 #include <bits/stdc++.h> using namespace std; template<typename T> ostream& operator<<(ostream&os, const vector<T>& v) { for(int i=0; i<v.size(); i++) os << v[i] << " "; return os; } int readi() { int i; cin >> i; return i; } int alg(vector<int>& a) { int score = 0; for(int i=0; i<(a.size()-1); i++) { int min_idx = i; for(int j=i+1; j<(a.size()); j++) { if(a[min_idx] > a[j]) min_idx = j; } score += min_idx - i + 1; reverse(a.begin()+i, a.begin()+min_idx+1); } return score; } int main(int argc, char** argv) { ios::sync_with_stdio(false); cin.tie(0); int t, len; cin >> t; for(int i=0; i<t; i++) { cin >> len; vector<int> a; for(int j=0; j<len; j++) a.push_back(readi()); //cout << "[Debug] " << a << endl; int score = alg(a); cout << "Case #" << i+1 << ": " << score << endl; } return 0; }
下一篇將會檢討 Qualification Round 其他的題目。
留言
張貼留言