找到最小数。
输入一个高精度的正整数N(不超过5000位) , 去掉其中任意k个数字后剩下的数字按原左右次序 将组成一个新的正整数。
对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小。输入格式:
第一行给定一个不超过五千位的正整数n。 第二行给定一个不超过n的位数的非负整数k。
输出格式:
最后剩下的最小数。
输入样例:
175438 4
输出样例:
13
思路:
在整数的位数固定的前提下,让高位的数字尽量小,整数的值就小
eg 175438
删除1个:去掉7——15438(不是去掉8——17543)
删除2个:去掉7,5——1438
删除3个:去掉754——138 (不是去掉785——143)
按高位到到低位的顺序搜索,若各位数字递增,则删除最后一个数字
如果递减,则删除第一个(尽量高位)递减区间的首字符
然后回到串首,按上述规则删除下一个数字。
代码:
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<vector>
#include<iomanip>
#include<vector>
#include<string>
#define M 5010
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
vector<int>v;
string s;
int main(){
cin >> s;
for(int i=0; s[i]; i++)
v.push_back(s[i]-'0');
v.push_back(-1);
int k;
cin >> k;
while(k--){ //删除k个
int t=0;
while(v[t]<=v[t+1] && v[t]!=-1)
t++;
v.erase(v.begin()+t);
}
bool flag = 0; //输出
for(int i=0; v[i]!=-1; i++){
if(v[i]!=0) flag = 1;
if(flag) cout << v[i];
}
if(!flag) cout << 0;
cout << endl;
return 0;
}