Loading...

Moo

click

一道与格雷码类似的题目

先把前几个串的长度求出来,二分查找出属于哪一个串

然后递归求解就可以

#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

posted @ 2020-08-28 07:00  Youngore  阅读(226)  评论(0)    收藏  举报