前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NYOJ 139 我排第几个(康拓展开+康拓展开逆运算)

NYOJ 139 我排第几个(康拓展开+康拓展开逆运算)

作者头像
Ch_Zaqdt
发布2019-01-28 11:04:46
3690
发布2019-01-28 11:04:46
举报
文章被收录于专栏:Zaqdt_ACMZaqdt_ACM

题目链接:http://nyoj.top/problem/139

       康拓展开的裸题,对于康拓展开的定义是求当前的排列位于全排列中的第几个,比如132就是123的全排列的第二个,对于康拓展开的求法就是ans = ai*(n-1)!+ai*(n-2)!+....+ai*1!+ai*0!,对于ai的定义是当前这个数的后面还有多少个比它小的数。


AC代码:

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
string str;
int n;

int Fun(int x){
	return x == 0 ? 1 : x * Fun(x - 1);
}

int Contor(){
	int sum = 0;
	int len = str.length();
	for(int i=0;i<len;i++){
		int cnt = 0;
		for(int j=i+1;j<len;j++){
			if(str[i] > str[j]) cnt ++;
		}
		sum += cnt * Fun(len - i - 1);
	}
	return sum + 1;
}

int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		cin>>str;
		printf("%d\n", Contor());
	}
	return 0;
}

       那么对于康拓展开的逆运算,就是倒着去推就好了。

代码语言:javascript
复制
int resContor(int n,int k,int pre[]){
	k--;                     // 排第k个,需要先减1
	for(int i=0;i<n;i++){
		int t = k / Fun(n - i - 1);   // Fun求阶乘
		for(int j=1;j<=n;j++){
			if(vis[j] == false){
				if(t == 0) break;
				t --;
			}
		}
		pre[i] = j;
		vis[j] = true;
		k %= Fun(n - i - 1);
	}
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档