问题描述:
键盘输入一个高精度的正整数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; }