名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

ABC 027 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;
}

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