网站页面
当前课程
成员
General
主题 1
主题 2
主题 4
主题 5
主题 6
主题 7
主题 8
主题 9
主题 10
主题 11
主题 12
主题 13
主题 14
主题 15
主题 16
主题 17
主题 18
主题 19
主题 20
排列统计
成绩 | 开启时间 | 2014年09月19日 星期五 10:07 | |
折扣 | 0.8 | 折扣时间 | 2014年09月26日 星期五 10:07 |
允许迟交 | 是 | 关闭时间 | 2014年09月26日 星期五 10:07 |
输入文件 | findpermutations.in | 输出文件 | findpermutations.out |
【题目描述】
排序是生活中最常见的操作之一,计算机科学对此大有用武之地。稍有常识的人都知道,基于交换的排序时间复杂度下界是O(nlogn)。这意味着可能设计出的最好排序算法将用至少O(nlog(n))次交换操作来给n个整数排序。虽然如此,对给定的n个整数,如果你知道每个数在排序后的位置,那么你总能找到一个包含至多n-1次交换的操作序列来将它们按升序排列。考虑四个元素<1 2 3 4>,有24种可能的排列,并且你知道每个元素在排序后的位置。
如果排列是<2 1 4 3>,至少需要进行2次交换来让它有序(分别交换1,2和4,3)。如果排列是<2 3 4 1>,就至少需要进行3次交换。<4 2 3 1>需要1次交换,<1 2 3 4>不需要交换。用这种方法,我们可以找到包含N个不同整数,并且至少交换K次才能排序的排列数。
【输入格式】
输入包含最多250组数据。
每组数据占1行,含2个正整数N(1<=N<=21)和K(0<=K<N)。
输入结束标志为N=K=0.
【输出格式】
对于每组数据,输出至少交换K次才能排序的排列数。
【样例输入】
3 1 3 0 3 2 0 0
【样例输出】
3 1 2
【来源】
UVa11077 Find the Permutations
刘汝佳,《算法竞赛入门经典训练指南》表2-10
Problemsetter: Md. Kamruzzaman
Special Thanks: Abdullah-al-Mahmud