UVa 1262 第k字典序 Password

2022-05-22 10:30:09 字數 1630 閱讀 5217

題意:

給出兩個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是字首...