結果
問題 | No.366 ロボットソート |
ユーザー |
![]() |
提出日時 | 2016-04-30 00:20:00 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 1,265 bytes |
コンパイル時間 | 621 ms |
コンパイル使用メモリ | 64,356 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-12-29 17:46:38 |
合計ジャッジ時間 | 1,535 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 23 |
ソースコード
/*8 6 5 3 1 10->分解(a[i], a[i+k], a[i+2k], …と選んでグループiを作る)->8 5 16 3 10同じ行の数字同士で交換になる。-> 各グループで交換回数を独立に最小化すればよい。グループ内では操作が隣り合った2要素を交換になる。-> 反転数を考えると、バブルソートが最善!!バブルソートして昇順にならなければ、-1を出力すればよい。O(N^2/K) … 計算量が最高に面白いです!*/#include <iostream>#include <algorithm>#include <vector>using namespace std;int n, k;int a[1000];int bubbleSort(vector<int> &a) {int i, j, cnt = 0;for (i = 0; i < a.size() - 1; i++) {for (j = a.size() - 1; j > i; j--) {if (a[j-1] > a[j]) {cnt++;swap(a[j-1], a[j]);}}}return cnt;}int main() {int i, j;cin >> n >> k;for (i = 0; i < n; i++) cin >> a[i];vector<int> arrays[1000];for (i = 0; i < n; i++) arrays[i % k].push_back(a[i]);int ans = 0;for (i = 0; i < k; i++) if (arrays[i].size() >= 2) ans += bubbleSort(arrays[i]);for (i = 0; i < n; i++) a[i] = arrays[i % k][i / k];for (i = 0; i < n - 1; i++) if (a[i] > a[i+1]) break;if (i < n - 1) ans = -1;cout << ans << endl;return 0;}