康托展开&康托逆展开 的写法
康托展开
康托展开解决的是当前序列在全排序的名次的问题。
例如有五个数字组成的数列:1,2,3,4,5
那么1,2,3,4,5就是全排列的第0个【注意从0开始计数】
1,2,3,5,4就是第1个
1,2,5,3,4就是第2个
给定一个序列,怎么确定它的排名呢?
就用到了这样一个公式X=a[n]*(n-1)!+a[n-1]*(n-2)!+a[n-2]*(n-3)!+...+a[1]*0!
其中a[n]表示当前数是数列中未出现的数中第几小的【注意从0开始计数】
例如:对于序列3,2,5,4,1
对于3:比3小的有1、2,所以3是第2小的,X+=2*(5-1)!
对于2:比2小的有1,所以2是第1小的,X+=1*(4-1!)
对于5:比5小的有1、2、3、4,但由于2、3已经出现过了,所以目前5是第2小的,X+=2*(3-1)!
对于4:比4小的只剩1,所以X+=1*(2-1)!
对于1:已经是最小的,X+=0*(1-1)!
这样就求出了最后的排序啦!
为了节省时间,我们先预处理阶乘:
void cal(){
fac[0]=1;
for(int i=1;i<=9;i++) fac[i]=fac[i-1]*i;
}
然后就是康拓展开:
int kangtuo(int* a){
int ans=0;
for(int i=0;i<=n;i++) label[i]=1;
for(int i=0;i<n;i++){
int cnt=0;
for(int j=0;j<a[i];j++) if(label[j]) cnt++;
label[a[i]]=0;
ans+=cnt*fac[n-i-1];
}
return ans;
}
康托逆展开
康托逆展开就是知道排名,求出当前数列
首先,把排名转化为以0为开始的排名【就是自减1】
举个例子吧:
对于1,2,3,4,5,求第10的数列
10-1=9
第一个数:9/(5-1)!=0......9,所以第一个数是当前未出现的第0个数:1
第二个数:9/(4-1)!=1......3,所以第二个数是当前未出现的第1个数:3
第三个数:3/(3-1)!=1......1,所以第二个数是当前未出现的第1个数:4
第四个数:1/(2-1)!=1......0,所以第二个数是当前未出现的第1个数:5
第五个数:0/(1-1)!=0......0,所以第二个数是当前未出现的第0个数:2
就这样,第十数列就是1,3,4,5,2
void codel(int x){
int cnt;
for(int i=0;i<m;i++) label[i]=1;
for(int i=0;i<m;i++){
cnt=x/fac[m-1-i];
x=x%fac[m-1-i];
for(int j=0;j<m;j++){
if(!label[j]) continue;
if(!cnt) {label[j]=0;n[i]=j;break;}
cnt--;
}
}
}
康托展开&康托逆展开 的写法的更多相关文章
- HDU 1027 Ignatius and the Princess II(康托逆展开)
Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ( ...
- 康托展开&&康托逆展开
康托展开 简介:对于给定的一个排列,求它是第几个,比如54321是n=5时的第120个.(对于不是1~n的排列可以离散化理解) 做法: ans=a[n]*(n-1)!+a[n-1]*(n-2)!+~~ ...
- nyoj 139——我排第几个|| nyoj 143——第几是谁? 康托展开与逆康托展开
讲解康托展开与逆康托展开.http://wenku.baidu.com/view/55ebccee4afe04a1b071deaf.html #include<bits/stdc++.h> ...
- 康托展开&逆展开算法笔记
康托展开(有关全排列) 康托展开:已知一个排列,求这个排列在全排列中是第几个 康托展开逆运算:已知在全排列中排第几,求这个排列 定义: X=an(n-1)!+an-1(n-2)!+...+ai(i-1 ...
- 【数学】康托展开 && 康托逆展开
(7.15)康托展开,就是把全排列转化为唯一对应自然数的算法.它可以建立1 - n的全排列与[1, n!]之间的自然数的双向映射. 1.康托展开: 尽管我并不清楚康托展开的原理何在,这个算法的过程还是 ...
- 康托展开+逆展开(Cantor expension)详解+优化
康托展开 引入 康托展开(Cantor expansion)用于将排列转换为字典序的索引(逆展开则相反) 百度百科 维基百科 方法 假设我们要求排列 5 2 4 1 3 的字典序索引 逐位处理: 第一 ...
- 康托展开与逆康托展开模板(O(n^2)/O(nlogn))
O(n2)方法: namespace Cantor { ; int fac[N]; void init() { fac[]=; ; i<N; ++i)fac[i]=fac[i-]*i; } in ...
- lightoj1060【康托逆展开】
可以先看些资料:http://blog.csdn.net/keyboarderqq/article/details/53388936 参考谷巨巨:http://blog.csdn.net/azx736 ...
- 康托(Cantor)展开
直接进入正题. 康托展开 Description 现在有"ABCDEFGHIJ”10个字符,将其所有的排列中按字典序排列,给出任意一种排列,说出这个排列在所有的排列中是第几小的? Input ...
随机推荐
- html学习第一天
由于之后想做个网站,所以web前端的也要学习一下. 昨天看了一下html,今天做一下记录. 首先是安装工具,用文本编辑器有点麻烦,我选择的是强大的 Dreamweaver CS6,不过大家喜欢文本编辑 ...
- Qt-QML-Canvas-雷达扫描仪表简单
使用QML实现的雷达仪表的实现,主要实现了余晖扫描的实现,其他的还是比较简单的,后面可能会加入目标标识,目前的功能仅仅是一个假的扫描雷达 来看代码 /* 作者:张建伟 时间:2018年4月27日 简述 ...
- 创建oracle数据表示例sql
CREATE TABLE "BRAND_RELATION" ( "ID" NUMBER(10,0) NOT NULL ENABLE, ...
- Windows10 Oracle ODBC安装配置
项目紧迫,需在短时间内交付成果,新团队成员,吐嘈之前数据库设计太low,很难看懂数据库表结构间的关系,为了使新同事更好的了解数据库表结构,特意使用powerDesigner对oracle.mysql数 ...
- 人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型
人脸检测及识别python实现系列(5)——利用keras库训练人脸识别模型 经过前面稍显罗嗦的准备工作,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的te ...
- zepto 添加 animate组件
今天发现JQuery可以用 animate方法回到顶部,心想着zepto应该也可以 $('html,body').animate({ scrollTop: 0 }, 1000); 于是便用了一下,发现 ...
- Visual Assist 试用期过期怎么办?
Visual Assist 试用期过期怎么办 VS这个强大的编译器常常会配置番茄小助手 Visual Assist,但是有时候试用期会过期,又想免费试用,怎么办呢? 有一个方法可以充值番茄助手的试用期 ...
- python—退出ipython3的help()
退出ipython3的help() 组合键:ctrl+z
- pyqt5实现SMTP邮件发送
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'SMTP.ui' # # Created b ...
- 树状数组怒刷sum!!!(前缀和应用)
我们知道我们利用树状数组维护的是存到其中的a[ ]数组,但是我们做题需要的是sum[ ]数组,这才是我们真正需要的有用的信息,写这篇博客的目的便是整理一下sum数组是怎么样来应用解题的. 1. Sta ...