読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

ABC 027 C - 倍々ゲーム

AtCoderABC 競技プログラミング C++

回答

Submission #468297 - AtCoder Beginner Contest 027 | AtCoder

個人的にはB問題よりも読みやすい感じがして.なんとなく解放も浮かんでいた(諸事情によりA問題やるくらいの時間しかなかったのが悔やまれる)
小さい数字を手で試した結果と,解説がほぼ回答方針として一緒だったので,時間さえあれば実装できたのかもしれない.
解説のとおり二で何回割れるか(階層)考え,階層によって先手,後手の最適基準が決定するので,最適基準通りに動いた時にどうなるかを回答するだけ.
本来は階層が奇数,偶数の場合で分けて書くと良いのかもしれないが,処理をまとめられるなあと思い,少しコンパクトにまとめてみました.
(ちゃんと場合分けしたやつ
Submission #467853 - AtCoder Beginner Contest 027 | AtCoder

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
 
#include <map>
#include <set>
#include <string>
#include <algorithm>
#include <functional>
using namespace std;
#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n) for (int i=0;i<(n);i++)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)
#define INF 1<<30
#define MP make_pair
#define mp make_pair
#define pb push_back
#define PB push_back
#define DEBUG(x) cout<<#x<<": "<<x<<endl
#define ll long long
#define ull unsigned long long
 
int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    ll n;
    cin >> n;
 
    int depth = 0;
    for(ll t = n; t > 0; t /= 2)  depth++;
 
    ll temp = 1;
    int turn = 0;
    int alpha = depth % 2 == 0 ? 0 : 1;
    int bata = depth % 2 == 0 ? 1 : 0;
    while(temp <= n) {
        temp = turn++ % 2 == 0 ? temp * 2 + alpha : temp * 2 + bata;
    }
 
    cout << (turn % 2 == 0 ? "Takahashi" : "Aoki") << endl;
 
    return 0;
}

三項演算子とかも使いこなせるようになってきて良い感じです.