結果
問題 | No.3016 ハチマキおじさん |
ユーザー |
![]() |
提出日時 | 2025-01-25 14:18:32 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 89 ms / 2,000 ms |
コード長 | 1,354 bytes |
コンパイル時間 | 4,075 ms |
コンパイル使用メモリ | 282,640 KB |
実行使用メモリ | 9,028 KB |
最終ジャッジ日時 | 2025-01-25 23:15:57 |
合計ジャッジ時間 | 6,607 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge10 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 31 |
ソースコード
#include <bits/stdc++.h> using namespace std; using ll = long long; #ifdef LOCAL #include <debug.hpp> #else #define debug(...) #endif constexpr ll INF = 1LL << 60; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(20); int N; cin >> N; vector<int> A(N), B(N - 1); for (int i = 0; i < N; i++) cin >> A[i]; for (int i = 0; i < N - 1; i++) cin >> B[i]; sort(A.begin(), A.end()); sort(B.begin(), B.end()); // left[i] := [0, i) の不満度 // right[i] := [i, N) の不満度 vector<ll> left(N), right(N); for (int i = 0; i < N - 1; i++) { left[i + 1] = left[i] + abs(A[i] - B[i]); } for (int i = N - 2; i >= 0; i--) { right[i] = right[i + 1] + abs(A[i + 1] - B[i]); } // i 番目のハチマキを残したときの不満度の最小値 ll ans = INF; for (int i = 0; i < N; i++) { ans = min(ans, left[i] + right[i]); } // 残す可能性のあるハチマキの集合 L vector<int> L; for (int i = 0; i < N; i++) { if (ans == left[i] + right[i]) L.emplace_back(A[i]); } sort(L.begin(), L.end()); L.erase(unique(L.begin(), L.end()), L.end()); int T = L.size(); cout << T << '\n'; for (int i = 0; i < T; i++) { cout << L[i] << " \n"[i == T - 1]; } }