本关任务:掌握贪心算法的算法思想,并能利用贪心算法的算法思想解决删除数字问题。 给定n个纯数字组成的数字串,删除其中k(k<n)个数字后,剩下的数字按原来的秩序组成一个新的正整数,确定删除方案,使得剩下的数字组成的新的正整数最大。
时间: 2024-02-27 14:52:31 浏览: 198
贪心算法:任务调度问题.pdf
这是一个典型的贪心算法问题。我们考虑这样一种策略:每次删除一个数字,删除的数字应该是比其后面数字小的数字。这个策略是否正确呢?我们可以举一个例子来验证。假设数字串是"12345678",需要删除3个数字,按照上述策略,第一次应该删除3,变成"1245678";第二次应该删除4,变成"125678";第三次应该删除5,变成"12678"。最后剩下的数字是"12678",组成的新正整数是12678,是最大的。
下面是完整的代码实现:
```c++
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main(int argc, const char * argv[]) {
char s[1001];
int a[1001];
int k;
int n;
// 读入数据
scanf("%s%d", s, &k);
n = strlen(s);
// 将s中的前n-k个数字删除,使得剩下的数字组成的数最大
// a数组记录每个数字的位置,方便后面删除数字
// 每次删除比后面数字小的数字
for (int i = 0; i < n; i++) {
a[i] = i;
}
for (int i = 0; i < n - k; i++) {
int pos = i;
for (int j = i + 1; j < n; j++) {
if (s[j] > s[pos]) {
pos = j;
}
}
for (int j = pos; j > i; j--) {
swap(s[j], s[j - 1]);
swap(a[j], a[j - 1]);
}
}
s[n - k] = '\0';
sort(a + n - k, a + n);
for (int i = n - k + 1; i < n; i++) {
s[a[i]] = '\0';
}
// 输出结果
printf("%s\n", s);
return 0;
}
```
阅读全文