程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu2062-Subset sequence

hdu2062-Subset sequence

編輯:C++入門知識

推出子集每一個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 ; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved