貪心演算法4:刪數問題
阿新 • • 發佈:2019-01-23
題目描述
鍵盤輸入一個高精度的正整數N,去掉其中任意kk個數字後剩下的數字按原左右次序將組成一個新的正整數。程式設計對給定的N和k,尋找一種方案使得剩下的數字組成的新數最小。
輸出應包括所去掉的數字的位置和組成的新的整數。(N不超過250位) 輸入資料均不需判錯。
Simple Input
178543
4
Simple Output
13
貪心策略:每次刪掉的數都要保證刪除數後剩下的數最小。即就是每次都要刪除第一個遞減區間的第一個數。
本題容易犯錯的地方,不能每次都刪除最大的數。
例如:141519 2 //如果刪最大的9,5,結果為1411,如果刪掉4,5,結果為1119,顯然刪掉4,5才是最佳答案。
刪除字串中的第一個遞減區間的數
#include<iostream> #include<cstring> #define MAXN 255 using namespace std; char a[MAXN]; int main() { //freopen("a.txt","r",stdin); cin >> a; int n = strlen(a); int m; cin >> m; while(m--) { for(int i = 0; i < n; ++i) { if(a[i] > a[i+1]) { for(int k = i; k < n; ++k)//指標往前移動 { a[k] = a[k+1]; } } break;//第一次刪數完畢,跳出迴圈 } --n; } bool flag = false; for(int i = 0; i < n; ++ i) { if(a[i] != '0') flag = true;//刪除串首的零 if(flag) cout << a[i]; } if(!flag) cout << "0" << endl; cout << endl; return 0; }