click
一道与格雷码类似的题目
先把前几个串的长度求出来,二分查找出属于哪一个串
然后递归求解就可以
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
| #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); 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