Problem Description
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
输入有多组 每组包括原始数n,要去掉的数字数s;
Output
输出去掉s个数后最小的数
Sample Input
178543 4
Sample Output
13
题解:
使用贪心,删去递增区间末位或递减区间首位,取得局部最优解,同时注意处理0为前置时的情况
例如1002 2 结果为0 而不是00
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
char a[110];
int s;
while(cin>>a>>s){
int len=strlen(a);
if(s>=len) {
cout<<"0"<<endl;
continue;
}
//n次循环,删去递增区间末位或递减区间首位,实现区部贪心
while(s--){
int j=0;
while(j<len&&a[j]<=a[j+1]){
j++;
}
//进行前移
len--;
for(int i=j;i<len;i++){
a[i]=a[i+1];
}
}
//处理前置字符为0
int i=0;
while(a[i]=='0'&&i<len){
i++;
}
if(i==len) cout<<"0"<<endl;
else {
for(int k=i;k<len;k++){
cout<<a[k];
}
cout<<endl;
}
}
return 0;
}