最小新整數 OpenJ_Bailian - 4137 (貪心)
阿新 • • 發佈:2018-11-09
https://vjudge.net/problem/OpenJ_Bailian-4137
一道基礎的貪心問題, 開始為演算法還糾結了好一會, 其實想明白就好了
1.每次都刪去位數更大且大於大於右邊的數
2.如果依然k>0, 刪去最大的數
3.如果依然k>0, 依次刪(也就是所有數都相等的情況)
//Bookshelf #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; int T, k; string n; int findMax() { string tmp = n; int ret, maxp = -1; for(int i = 0; i < n.length(); i++) if(n[i]-'0' > maxp) maxp = n[i]-'0', ret = i; return ret; } void solve() { //先從左往右判斷把所有大於右邊位的數刪掉 for(int i = 0; i < n.length()-1 && k > 0; i++){ if(n[i] > n[i+1]) n.erase(i,1), i--, k--; } //再每次都刪最大的數 while(k>0){ n.erase(findMax(), 1), k--; } //如果依然k>0, 從前往後刪掉位數直至k=0 (也就是所有數都一樣的情況) if(k>0) for(int i = 0; i < n.length() && k > 0; i++) n.erase(i,1), i--, k--; cout << n << endl; } int main() { cin >> T; while(T--){ cin >> n >> k; solve(); } return 0; }