【真题研究】CSP-S2019

[CSP-S2019] 格雷码#

很简单的规律题。

考虑决策每一位的 0/1,从高位往低位决策。将 k 可以看作当前的排名。

i 位若 2i1<k,说明当前位为 0。否则当前位为 1,并将排名更新为 k=2ik1 然后继续决策即可。

时间复杂度 O(n),递归或循环实现都可。

#include<bits/stdc++.h>
#define int long long
#define For(i,l,r) for(int i=l;i<=r;++i)
#define FOR(i,r,l) for(int i=r;i>=l;--i)

using namespace std;

const int N = 65;

int n, k, ans[N];

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(nullptr), cout.tie(nullptr);
  cin >> n >> k;
  FOR(i,n,1) {
    int pw = (1ll<<(i-1));
    if(k < pw) {
      ans[i] = 0;
    } else {
      ans[i] = 1;
      k = 2 * pw - k - 1;
    }
  }
  FOR(i,n,1) {
    cout << ans[i];
  }
  return 0;
}

#

作者:Daniel-yao

出处:https://www.cnblogs.com/Daniel-yao/p/18498884

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Daniel_yzy  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示