题目描述
键盘输入一个高精度的正整数N(不超过250位) ,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小。
输入格式
n (高精度的正整数)
k(需要删除的数字个数)
输出格式
最后剩下的最小数。
输入输出样例
输入 #1
175438
4
输出 #1
13
贪心水题
这道题让我想到今年ICPC省赛的热身题。。
当时还是学长指点才写出来(我们太菜了太菜了太菜了)
贪心思想:判断当先的数是否比下一位数大,大的话删掉,(索白了就是尽可能的把小数往前移),最后如果数列已经单调递增但是还有删除机会,就把大数删掉(因为输出的位数是固定的),因为此时数列已经单调了,只需要把最后的几位忽略就行了。最后要小心先导零
还有10 1这种数据。。。(被坑了一发)
ACCODE
#include <iostream>
using namespace std;
int main()
{
string a;
int n;
cin>>a>>n;
int f=1;
while(n&&f)
{
f=0;
for(int i=0;i<a.size()-1;i++)
{
if(a[i]>a[i+1])
{
a.erase(i,1);
n--;
f=1;
break;
}
}
}
f=1;
for(int i=0;i<a.size()-n;i++)
{
if(a[i]=='0'&&f) continue;
else if(a[i]!='0'&&f)
f=0;
cout<<a[i];
}
if(f==1)
cout<<0;
return 0;
}