NYOJ - 143 第几是谁? & NYOJ - 149 我排第几个

来源:互联网 发布:人工智能玩游戏 编辑:程序博客网 时间:2024/04/27 20:37

1.题面

http://acm.nyist.net/JudgeOnline/problem.php?pid=143

http://acm.nyist.net/JudgeOnline/problem.php?pid=139

2.题意

两道题,一个是给你这个排列在所有排列中的排名,让你给出原来的序列,另一个是给出序列,让你求出原来的排名。

3.思路

需要使用康拓展开和康拓逆展开,核心代码如下

ll fact[size];int set_Fact(){fact[0] = fact[1] = 1;for (int i=2;fact[i-1]<1e10;i++)fact[i] = fact[i-1]*i;}ll cantor_exp(int *arr,int len){/*Rank counts from zero.*/int i,j,k;ll ret = 0;for (i=0;i<len;i++){k = 0;for (j=i+1;j<len;j++)if (arr[j]<arr[i])k++;ret += k*fact[len-i-1];}return ret;}void cantor_reexp(int * arr,int len,ll rank){/*The input rank should counts from zero.Then output rank counts from zero.*/int i,j,k;bool *vis = new bool[len];fill(vis,vis+len,false);for (i=0;i<len;i++){arr[i] = rank/fact[len-i-1];for (j=0;j<=arr[i];j++){if (vis[j]){arr[i]++;}}vis[arr[i]] = true;rank %= fact[len-i-1];}delete[] vis;}

4.代码

两道题的代码如下

int main(){std::ios::sync_with_stdio(false);cin.tie(0);int i,j;char str[size];int num[size];set_Fact();int T;cin >> T;while (T--){cin >> str;int len = strlen(str);for (i=0;i<len;i++){num[i] = str[i] - 'a' + 1;}cout << cantor_exp(num,len) << endl;}return 0;}

int main(){std::ios::sync_with_stdio(false);cin.tie(0);int i,j;char str[size];int num[size];set_Fact();int T;cin >> T;int len = 12;while (T--){ll n;cin >> n;cantor_reexp(num,len,--n);for (i=0;i<len;i++)cout << char(num[i]+'a');cout << endl;}return 0;}

0 0
原创粉丝点击