C++の練習を兼ねて, AtCoder Grand Contest 041 の 問題A (A – Table Tennis Training) を解いてみた.
■感想.
1. 時間かかってしまったものの, 何とかAC版となった.
2. 引き続き, 時間を見つけて, 過去問の学習を進めていきたいと思う.
本家のサイトAtCoder Grand Contest 041解説をご覧下さい.
■C++版プログラム(問題A/AC版).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <bits/stdc++.h> using namespace std; using LL = long long; int main(){ // 1. 入力情報. LL N, A, B; scanf("%lld %lld %lld", &N, &A, &B); // 2. 最小のラウンド数は? LL ans = 0; if((B - A) & 1){ // 卓 1, N のうち, 近い方は? LL near = min(A - 1, N - B); // A, B の いずれかが, 卓 1, N に 到達し, 1回停止できるように勝敗をコントロール. ans = near + 1; // A, B が お互いに近づくように勝敗をコントロール. if(near == A - 1) ans += (B - near - 1) / 2; else ans += (N - near - 1 - A) / 2; }else{ ans = (B - A) / 2; } // 3. 出力. printf("%lld\n", ans); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
[入力例] 5 2 4 [出力例] 1 ※AtCoderテストケースより [入力例] 5 2 3 [出力例] 2 ※AtCoderテストケースより [入力例] 7 2 7 [出力例] 3 ※ A, B は, 以下のように動けば良さそう(w: 勝利, l: 敗北). A: l(3) -> l(4) -> l(5) B: l(7) -> w(6) -> w(5) [入力例] 9 2 7 [出力例] 4 ※ A, B は, 以下のように動けば良さそう(w: 勝利, l: 敗北). A: w(1) -> w(1) -> l(2) -> l(3) B: w(6) -> w(5) -> w(4) -> w(3) [入力例] 10 5 8 [出力例] 4 ※ A, B は, 以下のように動けば良さそう(w: 勝利, l: 敗北). A: l(6) -> l(7) -> l(8) -> l(9) B: l(9) -> l(10) -> l(10) -> w(9) [入力例] 10000000000 12345678 23456789 [出力例] 17901233 [入力例] 10000000000 7890123456 8901234567 [出力例] 1604320989 |
■参照サイト
AtCoder Grand Contest 041