| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:原理 本质上就是个排列数的方法,他这个更针对具体情况O(1)时间,我贴下自己的代码。。In Reply To:原理 Posted by:huicpc0860 at 2010-04-07 20:50:24 O(logN*log(logN))
//O(logN*log(logN))
#include <cstdio>
#include <algorithm>
#define N 22
using namespace std;
int num;
int bin[N],k;
int dec;
void ToBinary()
{
k = 0;
while(num)
{
bin[k++] = num % 2;
num /= 2;
}
int i;
for(i=0;i<k/2;i++)
{
int t = bin[i];
bin[i] = bin[k-1-i];
bin[k-1-i] = t;
}
}
void ToDecimal()
{
dec = 0;
int power = 1;
int i;
for(i=k-1;i>=0;i--)
{
dec += bin[i] * power;
power *= 2;
}
}
//排列数(变型)
bool Next()
{
int u,v;
if(k==1)
{
bin[0] = 1;
bin[k++] = 0;
return true;
}
for(u=k-2;u>=0;u--)
{
if(bin[u]<bin[u+1])
{
break;
}
}
if(u==-1)
{
int i;
for(i=k;i>=1;i--)
{
bin[i] = bin[i-1];
}
bin[0] = 0;
k++;
return false;
}
for(v=k-1;v>u;v--)
{
if(bin[v]>bin[u])
{
break;
}
}
int t = bin[u];
bin[u] = bin[v];
bin[v] = t;
sort(bin+u+1,bin+k);
return true;
}
int main()
{
while(scanf("%d",&num)!=EOF)
{
if(!num)
{
break;
}
ToBinary();
while(!Next());
ToDecimal();
printf("%d\n",dec);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator