題意:
給出兩個6行5列的字母矩陣,乙個密碼滿足:密碼的第i個字母在兩個字母矩陣的第i列均出現。
然後找出字典序為k的密碼,如果不存在輸出no
分析:我們先統計分別在每一列均在兩個矩陣出現的字母,然後從小到大排好序。
對於第乙個樣例來說,我們得到acdw、bop、gmox、ap、gsu
則一共有4×3×4×2×3=288種密碼,我們先計算這個數列的字尾積:288、72、24、6、3、1
要確定第乙個字母,如果1≤k≤72,則是a;如果73≤k≤144,則是c,以此類推。
確定第二個字母是類似的,用k%72+1與24去比較。
**實現中,字典序是從0開始的。
1**君一//#define debug
2 #include 3 #include 4
5char g[2][6][5], ans[6], select[6][5];6
int vis[2][26], hehe[6], cnt[5];7
8int
main()935
36#ifdef debug
37for(int i = 0; i < 5; ++i)
3843
#endif
//debug
4445
for(int i = 4; i >= 0; --i)
46 hehe[i] = cnt[i] * hehe[i+1
];47
if(k >= hehe[0
])48
52for(int i = 0; i < 5; ++i)
5358 ans[5] = '\0'
;5960 printf("
%s\n
", ans);61}
6263
return0;
64 }
解法二:
因為密碼最多有65 = 7776種,所以可以按字典序從小到大列舉。
思維難度小,寫起來更快更對。
1 #include 2 #include 3**君二4int
k, cnt;
5char g[2][6][5], ans[6];6
7bool dfs(int
col)817
return
false;18
}1920bool vis[2][26
];21 memset(vis, false, sizeof
(vis));
22for(int i = 0; i < 2; ++i)
23for(int j = 0; j < 6; ++j)
24 vis[i][g[i][j][col] - '
a'] = 1;25
for(int i = 0; i < 26; ++i)
26if(vis[0][i] && vis[1
][i])
2731
return
false;32
}3334int
main()
3549
50return0;
51 }
字典序的第K小數字
給定整數 n 和 k,找到 1 到 n 中字典序第 k 小的數字。1 k n 109。n 10時,字典序 1,10,2,3,4,5,6.可以把這n個數字看成字典樹,那麼每乙個字首都代表乙個數字,其中每個節點有10個兒子,0 9.那麼字典樹的先序遍歷的第k個就是答案。所以得到了乙個o k 的做法。這類...
poj 1037 動態規劃 字典序第k大
題目大意 給定n個數字,規定一種 cute 排序 序列中的數字大小為嚴格的波浪形,即 a 0 a 1 a 2 a 3 或者 a 0 a 1 a 2 a 3 對於n個數字來說,可以構成多個cute序列,這些序列按照字典序進行排序,求出第k個序列。題目分析 一 求字典序的第i個排列 直接一位一位列舉答案...
440 字典序的第K小數字
題目鏈結 解題思路 一次計算以1,2,3,4,5,6,7,8,9,10,11,12.為字首的,不超過上界n的數字個數,對數字總數進行累加,累加的和為k時,將此時字首的下乙個數字prefix 1返回,即為字典序的第k小數字。c include using namespace std prefix是字首...