首页 > 其他 > 详细

【杭电acm】2062 Subset sequence

时间:2014-03-13 07:31:00      阅读:931      评论:0      收藏:0      [点我收藏+]

这道题目非常好,饶了点儿圈子。我的思路是,先按照组排列。例如,
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,题目非常好。

bubuko.com,布布扣
#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("\n");
    }

    return 0;
}
bubuko.com,布布扣

【杭电acm】2062 Subset sequence,布布扣,bubuko.com

【杭电acm】2062 Subset sequence

原文:http://www.cnblogs.com/bombe1013/p/3596237.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!