使用C语言完成下面问题 键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。 编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。 输入格式: 输入两个数字,分别为原始数n,要去掉的数字数s (s < n); 输出格式: 输出去掉s个数后最小的数。
时间: 2024-02-23 16:57:48 浏览: 175
以下是使用 C 语言实现的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_LEN 105
char str[MAX_LEN];
char ans[MAX_LEN];
void dfs(int cur, int cnt, int s) {
if (cnt == s) {
ans[cur] = '\0';
return;
}
char min_char = '9' + 1;
int min_pos = -1;
for (int i = cur; str[i]; i++) {
if (str[i] < min_char) {
min_char = str[i];
min_pos = i;
}
}
ans[cur] = min_char;
dfs(cur + 1, cnt, s);
for (int i = min_pos + 1; str[i]; i++) {
if (str[i] == min_char) {
continue;
}
ans[cur] = str[i];
dfs(cur + 1, cnt + 1, s);
}
}
int main() {
int s;
scanf("%s%d", str, &s);
dfs(0, 0, s);
printf("%s\n", ans);
return 0;
}
```
算法思路:
首先我们可以观察到,要使得剩下的数字组成的新数最小,我们应该尽可能保留原数的高位数字,这样可以使新数更小。因此我们可以使用 DFS 枚举所有可能的方案,每次选择当前未被删除的数字中最小的一个,并继续向后递归。如果已经删除了 $s$ 个数字,或者当前已经到达字符串结尾,则递归结束。
在实现时,我们可以使用一个字符数组 `ans` 来保存当前的方案,以及一个计数器 `cnt` 来记录已经删除的数字个数。在 DFS 过程中,我们从当前位置开始遍历字符串,找到当前未被删除的数字中最小的一个,并将其加入到 `ans` 中,并继续向后递归。如果遇到一个数字比最小值大,则说明该数字可以删除,我们可以将其删除,并继续递归。当 `cnt` 达到 $s$,或者已经到达字符串结尾时,递归结束。最终得到的 `ans` 就是最小的新数。
时间复杂度:$O(n^s)$,其中 $n$ 表示字符串的长度,$s$ 表示要删除的数字个数。
阅读全文