POJ 1392 - Ouroboros Snake 求0011这类序列欧拉回路的最小路径...
2013-08-29 16:30
375 查看
题目:
就是说有一个转盘..有2^n个格子...每次将当前指的位置为起点长度为n的框住得到一个数..转一圈能正好得到0~(2^n)-1的数..问满足这个条件的转盘分布并且字典序最小..第k个出现的数是多少..
题解:
这道题和HDOJ 2894差不多..构造出序列后..直接找答案就是..
Program:
就是说有一个转盘..有2^n个格子...每次将当前指的位置为起点长度为n的框住得到一个数..转一圈能正好得到0~(2^n)-1的数..问满足这个条件的转盘分布并且字典序最小..第k个出现的数是多少..
题解:
这道题和HDOJ 2894差不多..构造出序列后..直接找答案就是..
Program:
#include<iostream> #include<stdio.h> #include<string.h> #include<cmath> #include<queue> #include<stack> #include<set> #include<time.h> #include<map> #include<algorithm> #define ll long long #define eps 1e-5 #define oo 1000000007 #define pi acos(-1.0) #define MAXN 10005 #define MAXM 100005 using namespace std; int ans[100005],n,num; bool used[100005]; void dfs(int x) { int t1=(x<<1)&((1<<n)-1),t2=t1|1; if (!used[t1]) { used[t1]=true; dfs(t1); ans[++num]=0; } if (!used[t2]) { used[t2]=true; dfs(t2); ans[++num]=1; } } int main() { int k,i,j,m; while (~scanf("%d%d",&n,&k) && n) { num=-1; for (i=0;i<n-1;i++) ans[++num]=0; memset(used,false,sizeof(used)); dfs(0); for (i=n-1,j=num;i<=j;i++,j--) swap(ans[i],ans[j]); for (i=k,m=0;i<=k+n-1;i++) m=m*2+ans[i]; printf("%d\n",m); } return 0; }
相关文章推荐
- POJ 1392 Ouroboros Snake (欧拉回路)
- POJ-1392 Ouroboros Snake 欧拉回路
- POJ 1392 Ouroboros Snake 欧拉回路
- POJ 1392 Ouroboros Snake(数位欧拉:输出路径)
- poj 1041(欧拉回路+输出字典序最小路径)
- poj 1041(欧拉回路+输出字典序最小路径)
- poj 2337 欧拉回路输出最小字典序路径 ***
- poj 3216 最短路+最小路径
- POJ-2060-Taxi Cab Scheme-最小路径覆盖
- POJ 1041 - John's trip 输出欧拉回路路径边..通用做法
- poj 2060 最小路径覆盖
- POJ 1780 - Code 非递归..输出欧拉回路边路径..
- POJ_3020_最小路径覆盖
- POJ 2253 Frogger【最短路变形——路径上最小的最大权】
- POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】
- poj 1041 John's trip (边最小字典序欧拉路径 Fleury)
- POJ1422 最小路径覆盖入门
- POJ 2060 最小路径覆盖
- 打印欧拉路径问题 hihoCoder - 1182 POJ - 1392 POJ 1780 POJ - 2237
- POJ 2337 欧拉回路+欧拉路径+判断欧拉回路和路径