wordpress 系统安装,怎样让网站排名优化工,免费公司起名字大全,免费又不用登录的游戏题目链接 紫书P323 题意#xff1a;两个6*5的字母矩阵#xff0c;两个矩阵每列相同的字母#xff0c;每列取一个#xff0c;求按照字典序第k小的序列 分析#xff1a; 对于第一个样例来说#xff0c;我们得到{ACDW}、{BOP}、{GMOX}、{AP}、{GSU} 则一共有43423288种密码两个6*5的字母矩阵两个矩阵每列相同的字母每列取一个求按照字典序第k小的序列 分析 对于第一个样例来说我们得到{ACDW}、{BOP}、{GMOX}、{AP}、{GSU} 则一共有4×3×4×2×3288种密码我们先计算这个数列的后缀积288、72、24、6、3、1 要确定第一个字母如果1≤k≤72则是A如果73≤k≤144则是C以此类推。 k / 72 1就是第一个集合中的第几个元素 求第二个集合的时候k k % 72 ... 还有一些处理的细节在代码中 #include iostream
#include cstring
#include algorithm
#include cstdio
using namespace std;
int k;
char G[2][10][10]; //一个三维的数组存储两个矩阵
int vis[2][30],cnt[10],he[10]; //vis[i][j]表示第i个矩阵第j个字母是否访问cnt是每一列的总数he是后缀积
char Select[10][10],ans[10]; //select[i][j]表示第i行第j个字母
int main()
{int test;scanf(%d, test);while(test--){scanf(%d, k);for(int i 0; i 2; i){for(int j 0; j 6; j)scanf(%s, G[i][j]);}memset(cnt, 0, sizeof(cnt));for(int i 0; i 5; i) //找两个矩阵对应的列中相同的元素处理的很好对每一列对两个矩阵一行一行的查找{memset(vis, 0, sizeof(vis));for(int j 0; j 2; j) {for(int m 0; m 6; m)vis[j][ G[j][m][i] - A ] 1;}for(int j 0; j 26; j){if(vis[0][j] vis[1][j]) //两个矩阵同一列都访问过了Select[i][ cnt[i] ] A j; //第i列第cnt[i]个放入这个字母}}he[5] 1;for(int i 4; i 0; i--){he[i] cnt[i] * he[i 1];}if(k he[0]){printf(NO\n);continue;}k--; //因为考虑到k 1的情况for(int i 0; i 5; i){int t k / he[i 1];ans[i] Select[i][t 1]; //对于每一个字母都是从1开始标号的整除之后取下一个就像k 1时每一列都得取第一个对于最后一列的时候 t 1那就取第二个了所以k--k k % he[i 1];}ans[5] \0;printf(%s\n, ans);}return 0;
} 转载于:https://www.cnblogs.com/zhaopAC/p/5222628.html