删数问题
通过键盘输入一个高精度的正整数n(n的有效位数≤240),去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n 和s,寻找一种方案,使得剩下的数字组成的新数最小。
求解思路说明
欲使整个数尽可能地小,则需优先使得高位的数尽可能小。
在删除一个数中的某位数时,该位数后面一位的数往前移至该位,即该位数变为其后面的数。所以欲通过删1个数使某位上的数变小,则需该位数后面的1位数比该数小,然后删除该数。
因此,欲使整个数尽可能小,要尽可能不断地删掉整个数最左边比其后一位数大的位置上的数,来使得整个数尽可能地小。
代码
#include <iostream>
#include <string>
using namespace std;
typedef long long ll;
string n;
int s;
int main()
{
ios::sync_with_stdio(false);
cin>>n>>s;
for(ll i1=0;i1<n.length();++i1)
{
if((i1==n.length()-1||n[i1]>n[i1+1])&&s>0)
{
n.erase(i1,1);
--s;
i1=0;
}
if(s==0)
{
break;
}
}
cout<<n<<endl;
return 0;
}