删数问题
题目描述
键盘输入一个高精度的正整数 N N N(不超过 250 250 250 位),去掉其中任意 k k k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N N N 和 k k k,寻找一种方案使得剩下的数字组成的新数最小。
输入格式
输入两行正整数。
第一行输入一个高精度的正整数 n n n。
第二行输入一个正整数 k k k,表示需要删除的数字个数。
输出格式
输出一个整数,最后剩下的最小数。
样例 #1
样例输入 #1
175438
4
样例输出 #1
13
解题思路
1.贪心算法,从头遍历到尾,依次比较相邻的两个数,若前一个数比后一个大,则删除,直到删除的数的个数等于题目要求为止,若遍历一遍后删除的数的个数未达到题目要求个数,直接删除尾数。
tip :每次应重新开始遍历,多试几个例子就好了 o(╥﹏╥)o
2.需处理 前导为 0 的情况,如 046 应输出的是 46.
代码
#include <stdio.h>
#include <string.h>
int main() {
char a[200];
int len, n;
scanf("%s", a);
len = strlen(a);
scanf("%d", &n);
for (int i = 0; i < len - 1; i++) {
if (a[i] > a[i + 1]) {
n--;
for (int j = i; j < len - 1; j++) {
a[j] = a[j + 1];
}
len--;
i = -1;//要重新开始遍历
}
if (n == 0)
break;
}
//处理输出像 004897 这种前面有 0 的情况
for (int i = 0; i < len - 1; i++) {
if (a[i] == '0') {
for (int j = i; j < len - 1; j++) {
a[j] = a[j + 1];
}
len--;
i = -1;
}
else break;
}
//嗯,len - n ,处理一次遍历删的数未达到题目要求的情况,n==0,无影响
for (int i = 0; i < len - n; i++)
printf("%c", a[i]);
return 0;
}
如若有错,欢迎大佬们斧正。