AGCお疲れ様でした。
AtCoder Grand Contest 041 - AtCoder
Writerがtouristの時点で最高に興奮しますね。
超つまづいた訳でもないのですが、僕が高校時代卓球部に所属していたこともあり、「うわ〜〜〜やってた、やってたw」って気持ちになったので、折角なので解説を書こうかと思います。
問題はこれです。
これ本当よくやってたんすよ・・・・(しつこい)
提出 #9180259 - AtCoder Grand Contest 041
#include <bits/stdc++.h>
#define INF 1e9
using namespace std;
#define REPR(i,n) for(int i=(n); i >= 0; --i)
#define FOR(i, m, n) for(int i = (m); i < (n); ++i)
#define REP(i, n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define ALL(a) (a).begin(),(a).end()
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
int gcd(int a,int b){return b?gcd(b,a%b):a;}
typedef long long ll;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
int main() {
ll N,A,B;
cin >> N >> A >> B;
if ((B-A)%2==0) {
cout << (B-A)/2 << endl;
return 0;
}
else {
auto m = min(abs(N-B),B-1);
auto m2 = min(abs(N-A),A-1);
// 壁最短コストを出す
auto wall_min = min(m,m2);
// どっちかが壁まで移動
auto ans = wall_min;
// 距離を出しとく
auto last = B-A;
// 壁側がいったん無駄な行動を取る
ans++;
last--;
// 隣接してた場合これで終わり
if (last==0) {
cout << ans << endl;
return 0;
}
// まだ距離がある場合は今までの移動回数と加算してそれを出力
cout << ans+(last/2) << endl;
}
return 0;
}