cf1560 F2. Nearest Beautiful Number (hard version)
阿新 • • 發佈:2022-05-19
題意:
一個整數被稱為 k-beautiful 的,當且僅當不同的數位數量 \(\le k\)
輸入 \(n,k\),求大於等於 \(n\) 的最小的 k-beautiful 數
\(T\le 1e4, 1\le n \le 1e9, 1\le k \le10\)
思路:
法一(要腦子):
找一段最短的、不同數位數恰為 k+1 的字首 \(n[1\sim p]\)
顯然這段字首 \(n[1\sim p]\) 不合要求,需要改變。我們將這段字首視為一個 p 位整數,把它加一;然後把 \(n[p+1\sim end]\) 置 0。
一直迴圈上面兩步即可。
上面的做法其實分為兩步:首先把字首一直加一,直到字首中不同數位數 \(\le k\)
例子:n = 789152352 k = 3
789200000 → 789300000 → 789700000
然後把後面的0都變成7 → 789777777
複雜度 \(O(Tm^2)\),m 為位數
string n; int k; bool ok() { set<char> S; for(char c : n) S.insert(c); return S.size() <= k; } void sol() { cin >> n >> k; while(!ok()) { set<char> S; for(int i = 0; ; i++) { S.insert(n[i]); if(S.size() > k) { while(n[i] == '9') i--; n[i]++; for(int j = i + 1; j < n.size(); j++) n[j] = '0'; break; } } } cout << n << endl; }
法二:數位dp,不用腦子
(待補)