| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1849 人关注过本帖, 1 人收藏
标题:我也来发个求排列的题
取消只看楼主 加入收藏
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 19楼 czz5242199
你可以用这组数据来测
1
19 12164510040883199
1 3 9 11 5 6 7 8 10 2 19 12 4 17 13 14 15 16 18

看你的程序多久后输出大答案
2012-06-01 18:35
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 21楼 czz5242199
晚点会放上代码的
2012-06-01 18:35
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 25楼 czz5242199
不一样

你测下这组多少
1
19 1216451
1 3 9 11 5 6 7 8 10 2 19 12 4 16 18 17 15 14 13

答案是
1 3 9 11 5 6 7 8 10 14 12 13 16 4 2 17 19 15 18
2012-06-01 19:19
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 27楼 czz5242199
应该你的错了 呵呵

你可以用置顶贴中的代码去运行这个 他们的结果一定正确的 呵呵
2012-06-01 19:26
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 29楼 beyondyf
没提交地址的 自己想的呵呵
你的想法完全正确的, 我就是看到那个置顶贴
然后想到了一个算法 然后就出了这题, 嘿嘿
2012-06-01 19:40
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 32楼 beyondyf
应该行吧, 反正跟我的程序运行出来的结果都一样的

我就当我们的程序时正确的吧 来给几组测试案列
输入:
5
19 121645100408832000
1 2 3 6 5 4 7 8 9 10 11 12 13 14 15 16 17 18 19
19 12164510040883   
1 2 3 6 5 4 7 8 9 10 11 12 13 14 15 16 17 18 19
19 121645
1 2 3 15 9 12 11 13 14 18 10 17 4 8 6 19 5 16 7
19 121645
1 2 3 15 9 12 11 13 14 18 19 16 5 8 4 7 10 6 17
19 3548219999110011323
19 10 2 18 11 15 1 16 9 17 8 12 6 14 13 5 7 3 4
输出:
1 2 3 6 5 4 7 8 9 10 11 12 13 14 15 16 17 18 19
1 2 3 15 9 12 11 13 14 18 10 17 4 8 6 19 5 16 7
1 2 3 15 9 12 11 13 14 18 19 16 5 8 4 7 10 6 17
1 2 3 15 9 12 11 13 14 19 6 17 7 8 16 18 5 10 4
3 14 16 7 10 15 2 19 13 1 5 12 6 18 11 4 9 17 8


我的代码: 主要思想就是康托展开和康托展开逆运算
程序代码:
#include<iostream>
using namespace std;

long long f[21] = {0,1,2};

long long cantor(int num[], int len) 
{
    long long sum = 0;
    for(int i=0; i<len; ++i) {
        int tmp = 0;
        for(int j=i+1; j<len; ++j)
            if(num[i] > num[j])
                tmp++;
        sum += f[len-i-1]*tmp;
    }
    return sum+1;
}

void uncantor(int num[], long long k, int len)
{
    int flag[30] = {0};
    for(int i=len-1; i>0; --i) {
        long long tmp = k / f[i];
        k = k % f[i];
        int j;
        for( j=1; j<=len; ++j) {
            if(flag[j]) continue;
            if( tmp == 0) break;
            tmp--;
        }
        
        num[len-i-1] = j;
        flag[j] = 1;
    }
    for(int i=1; i<=len; ++i)
        if( !flag[i] ) {
            num[len-1] = i;
            break;
        }
}

int main()
{
    int k;
    for(int i=3; i<=20; ++i)
        f[i] = f[i-1] * i;

    cout << f[19] << endl;
    while( cin >> k ) {
        while( k-- ) {
            long long n,m;
            cin >> n >> m;

            int num[30];
            for(int i=0; i<n; ++i) 
                cin >> num[i];

            long long cnt = cantor(num, n);
            if( (cnt + m) % f[n] ) m =(cnt+m) %f[n];
            else m =f[n];
            uncantor(num, m-1, n);

            cout << num[0];
            for(int i=1; i<n; ++i)
                cout << " " << num[i];
            cout << endl;
        }
    }
    return 0;
}
2012-06-01 20:00
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
收藏
得分:0 
回复 36楼 czz5242199
恩, 其实就是个数学题, 哈哈
2012-06-01 20:12
快速回复:我也来发个求排列的题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022287 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved