当前位置:编程学习 > C/C++ >>

hdu2062-Subset sequence

推出子集每一个n的位数的规律  num[ n ]  = n * (num[ n - 1 ] + 1 )  ;

然后进行枚举记录位数,下面的思路是参考别人的 ,我的相较复杂好多,这个优化好多。


[cpp] 
#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<cmath>  
 
using namespace std ; 
 
const int maxn = 25 ; 
long long  num[ maxn ] ; 
int n  ; 
long long m ; 
 
int main() 

    int i ; 
    int ans[ maxn ] ; 
    int used[ maxn ] ; 
    int temp1 , temp2 ; 
    num[ 1 ] = 1 ; 
    for( int i = 2 ; i <= 25 ; i ++ ) 
        num[ i ] = i * ( num[ i - 1 ] + 1 ) ; 
    while( cin >> n >> m ) 
    { 
        memset( used , 0 , sizeof( used ) ) ; 
        int cnt = 0 ; 
        while( cnt < n ) 
        { 
            if( m == 0 ) 
                break ;  
            for( i = 1 ; i <= n ; i++ ) 
            { 
                if( used[ i ] )  
                    continue ; 
                if( m > num[ n - cnt - 1 ] + 1 ) 
                    m -= num[ n - cnt - 1 ] + 1 ; 
                else 
                { 
                    ans[ ++cnt ] =  i ; 
                    m-- ; 
                    used[ i ] = 1 ; 
                    break ; 
                } 
            } 
        } 
        for( i = 1 ; i < cnt ; i++ ) 
            cout << ans[ i ] << " " ; 
        cout << ans[ cnt ] << endl ; 
    } 
    return 0 ; 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,