码迷,mamicode.com
首页 > 其他好文 > 详细

P5657 格雷码

时间:2019-11-16 21:24:55      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:out   namespace   反转   algorithm   int   思路   print   cstring   ace   

思路

考场上的递归思路

每次向下递归的时候判断是左半边还是右半边即可
注意向右半边递归之后下一层序列要反转过来即可

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
void solve(unsigned long long n,unsigned long long k,unsigned long long rev=0){
    if(rev)
        k=((1ULL<<(n))-1)-k;
    // cout<<n<<' '<<k<<' '<<rev<<endl<<endl;
    if(n==1){
        if(k==0)
            printf("0");
        else
            printf("1");
        return;
    }    
    if(k>((1ULL<<(n-1))-1)){
        printf("1");
        solve(n-1,k-((1ULL<<(n-1))),1);
    }
    else{
        printf("0");
        solve(n-1,k,0);
    }
}
unsigned long long n,k;
int main(){
    cin>>n>>k;
    solve(n,k);
    return 0;
}

P5657 格雷码

标签:out   namespace   反转   algorithm   int   思路   print   cstring   ace   

原文地址:https://www.cnblogs.com/dreagonm/p/11873923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!