删数问题
Description
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
输入两个数字,分别为原始数n,要去掉的数字数s (s < n)。
Output
输出去掉s个数后最小的数
Samples
Sample #1
Input
178543 4
Output
13
分析:
保证数字以升序排列可保证数据最小,
输出时要注意删除前导零,例:000123,应输出123
#include <bits/stdc++.h>
using namespace std;
const int N=3000010;
int main(){
string n;
int k;
cin>>n>>k;
string res="";//保存结果
int len=n.size();
if(k>=len){//要去掉的数个数大于本来的数个数
cout<<0<<endl;
return 0;
}
int cnt=0;//已经去掉的数个数
for(int i=0;i<len;i++){
while(cnt<k&&!res.empty()&&res.back()>n[i]){
//还要删除并且暂存的结果不为空并且结果的个位大于他的后一位
//保证存的是一个非降序
res.pop_back();//删除一位
cnt++;
}
res.push_back(n[i]);//把后一位放入
}
while(cnt<k){//如果遍历完仍需要删除,则从后往前删
res.pop_back();
cnt++;
}
// 删去前导0
int i=0;
while(i<res.size()&&res[i]=='0') i++;
if(i==res.size()) cout<<0<<endl;
else cout<<res.substr(i)<<endl;
return 0;
}