输入一个正整数n,去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。寻找一种方案,使得剩下的数字组成的新数最小
样例输入 n=178543 s=4
样例输出 13
思路
贪心
由于剩余的位数固定,要使得最后选出的数最小,优先使高位的数较小,从左向右遍历字符串,使每个数尽可能的小
每次遍历的区间[a,b],其中a是上次选的数的位置,b是总位数-剩余要选的数的个数,为了保证能选出应有的数量
代码
#include <iostream>
using namespace std;
int main()
{
int s;
string n;
cin >> n >> s;
int m = n.size();
string ans;
int cnt = m - s;
for (int i = 0, j = 0; i < cnt; i ++ )
{
int pos, min_num = 10;
for (; j <= m - (cnt - i); j ++ )
{
if (n[j] - '0' < min_num)
{
min_num = n[j] - '0';
pos = j;
}
}
j = pos + 1;
ans += '0' + min_num;
}
cout << (ans == "" ? "0" : ans);
return 0;
}
本文介绍了一个算法问题:如何通过移除指定数量的数字来构造一个尽可能小的新数字。使用贪心策略,从左到右遍历输入数字串,选择当前可选范围内的最小数字加入结果中,直至构造出目标长度的数字。
8119

被折叠的 条评论
为什么被折叠?



