AOJ 0299 Railroad II
解法
d(i) をソートし,かつ p が 0 となるようにずらしておく.
ちょっと考えると,解の候補としては
- d(1) まで反時計回りで一周する
- d(M) まで時計回りで一周する
- d(i) まで時計回りで訪れた後,そこから反時計回りで d(i+1) まで訪れる
- d(i+1) まで反時計回りで訪れた後,そこから時計回りで d(i) まで訪れる
の4通りしかないことが分かる.
あとはこれを実装するだけ.
ソースコード
#include <bits/stdc++.h> using namespace std; int main() { int N, M, p; cin >> N >> M >> p; vector<int> d(M); for(int i=0; i<M; ++i) { cin >> d[i]; d[i] -= p; d[i] = (d[i] + N) % N; } sort(d.begin(), d.end()); int res = min(d.back(), N - d[0]); for(int i=0; i<M-1; ++i) { res = min(res, min(2*d[i] + (N - d[i+1]), 2*(N - d[i+1]) + d[i])); } cout << res * 100 << endl; }