Moo
一道与格雷码类似的题目
先把前几个串的长度求出来,二分查找出属于哪一个串
然后递归求解就可以
#include <bits/stdc++.h>
#define int long long
#define debug
using namespace std;
//东方之珠 整夜未眠!
const int N = 1e5+66;
int s[N];
inline int dfs(int x, int k)
{
if (k == 0) return x == 1 ? 1 : 0;//递归边界
if (x <= s[k - 1]) return dfs(x, k - 1);//属于左边的上一个串
if (x > s[k] - s[k - 1]) return dfs(x + s[k - 1] - s[k], k - 1);//属于右边的上一个串
// if (x < s[k - 1] || x > s[k - 1] + 3 + k) dfs(x, k - 1);
else if (x == s[k - 1] + 1) return 1;//中间的...特判就好
return 0;
}
inline int thestars()
{
int i, j, n;
s[0] = j = 3;
for (i = 1; i <= 30; ++ i) s[i] = (s[i - 1] << 1) + (++ j);
cin >> n;
j = lower_bound(s + 1, s + 28, n) - s;
dfs(n, j) == 1 ? puts("m") : puts("o");
return 0;
}
int youngore = thestars();
signed main() {;}
后记
一年前坐在秦皇岛的考场上做格雷码,连打暴力加想正解,加各种调试,花了三个小时
如今正解+调试花了不到半个小时
一路走过来
才发现,我真的提高了
祝NOIP-2020全省Rank前3

浙公网安备 33010602011771号