AGC041A – Table Tennis Training

AGCお疲れ様でした。

AtCoder Grand Contest 041 - AtCoder

Writerがtouristの時点で最高に興奮しますね。

超つまづいた訳でもないのですが、僕が高校時代卓球部に所属していたこともあり、「うわ〜〜〜やってた、やってたw」って気持ちになったので、折角なので解説を書こうかと思います。

問題はこれです。

A - Table Tennis Training

これ本当よくやってたんすよ・・・・(しつこい)

1

2

3

提出 #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;
}
Licensed under CC BY-NC-ND 4.0
Built with Hugo
テーマ StackJimmy によって設計されています。