zoukankan      html  css  js  c++  java
  • 【HDOJ】2062 Subset sequence

    这道题目非常好,饶了点儿圈子。我的思路是,先按照组排列。例如,
    1            2           3
    1 2         2 1        3 1
    1 2 3      2 1 3     3 1 2
    1 3         2 3        3 2
    1 3 2      2 3 1     3 2 1
    分成3组,每组个数是确定的,因此可以通过m/组数获得第一个数字,然后组数因n--而减小。重新计算属于哪一组,但此时需要考虑printf的数字,因此使用visit数组保证每个数字仅遍历一次。需要注意的是m应先--,这样第1个和第5个可以保证在同一组内。组后需要注意long long,题目非常好。

    #include <stdio.h>
    #include <string.h>
    
    #define MAXNUM 25
    
    long long each_gp[MAXNUM] = {0};
    int visit[MAXNUM];
    
    int main() {
        int n;
        long long m;
        long long i, j, k;
    
        for (i=1; i<=20; ++i)
            each_gp[i] = (i-1) * each_gp[i-1] + 1;
    
        while (scanf("%d %I64d", &n, &m) != EOF) {
            memset(visit, 0, sizeof(visit));
    
            m--;
            k = m / each_gp[n] + 1;
            printf("%I64d", k);
            visit[k] = 1;
            m = m % each_gp[n--];
    
            while (m>0 && n>0) {
                m--;
                k = m / each_gp[n] + 1;
                j = i = 0;
                do {
                    i++;
                    if (visit[i] == 0)
                        j++;
                } while(j < k);
                printf(" %I64d", i);
                visit[i] = 1;
                m = m % each_gp[n--];
            }
            printf("
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    Java中抽象类和接口的区别
    servlet的转发与重定向
    JSP知识点
    过滤器与拦截器
    java关键字 super 和 this
    oracle 基础
    java 集合
    java 内部类
    java 数组详解
    图,深度优先遍历与广度优先遍历
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3596237.html
Copyright © 2011-2022 走看看