题目描述
给定一个十进制正整数 n (0<n<10000000000),每个数位上数字均不为 0。n 的位数为m。
现在从 m 位中删除 k 位 (0<k<m),求生成的新整数最小为多少?
例如: n=9128456,k=2, 则生成的新整数最小为12456。
输入
第一行 T, 表示有 T 组数据。
接下来 T 行,每一行表示一组测试数据,每组测试数据包含两个数字 n,k。
输出
T 行,每行一个数字,表示从 n 中删除 k 位后得到的最小整数。
输入输出样例
样例输入 #1
复制
2
9128456 2
1444 3
样例输出 #1
复制
12456
1
思路:
这道题一定不要有一种错误的认知就是,只要每次都删掉最大的那个数,这就是最优解,
其实不然,比如数字1243865,如果删掉8得到的数字是124365,如果删掉 4,得到的是123865,
显然删掉4比删掉8得到的数字还要小。
通过分析可知删数的规律
1.删掉自左至右,第一个大于它右面数的数字
2.如果是自然序的话,删掉最右面的数字
代码实现:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
string n;
int k;
void solve()
{
cin>>n>>k;
while(k--)
{
for(int i=0; i<n.size(); i++)
{
if(n[i]>n[i+1] || i==n.size()-1)
{
n.erase(i,1);
break;
}
}
}
cout<<n<<endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}