删数问题
题目描述
键盘输入一个高精度的正整数 N(不超过 250 位),去掉其中任意 k 个数字后剩下的数字按原左右次序将组成一个新的非负整数。编程对给定的 N 和 k,寻找一种方案使得剩下的数字组成的新数最小。
输入格式
输入两行正整数。
第一行输入一个高精度的正整数 n。
第二行输入一个正整数 k,表示需要删除的数字个数。
输出格式
输出一个整数,最后剩下的最小数。
样例 #1
175438
4
13
找到num[i]>num[i+1],这个就是每次剔除中的最小值,再将其后移,len--
直到剔除的数cnt大于等于k退出循环,如果不存在num[i]>num[i+1],退出循环,不存在num[i]>num[i+1],就代表num就是从小到大排序,此时剔除的数小于k,将len=len-(k-cnt)
如果剔除的数的个数大于数组中非0的个数,直接返回0
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1000;
int num[N];
char a[N];
int main() {
int k=0,cnt;
cin >> a;
cin >> k;
int len = strlen(a);
for (int i = 0; i <len; i++) num[i] = a[i]-'0';
//for (int i = 0; i <strlen(a); i++) cout << num[i] << " ";
cnt = 0;
//为要选出来的数字,选出来的数字就置为-1
int z_number = 0;//大于0的数字的个数
int number = len - k;//输出的个数
int flag = 0;//目前已经输出的个数
for (int i = 0; i < len; i++) {
if (num[i] > 0) {
z_number++;
};
};
if (z_number > k) {
while (cnt < k) {
int flag = 0;
for (int i = 0; i < len - 1; i++) {
if (num[i] > num[i + 1]) {//剔除第一个锋 就是第一个num[i]>num[i+1]
flag = 1;
for (int j = i; j < len - 1; j++) {
num[j] = num[j + 1];
};
num[len - 1] = -1;
len--;
cnt++;
if (cnt >= k)break;
break;//找到一次锋就退出
};
};
if (flag == 0)break;//没有峰就退出
//cout << cnt<<endl;
/*for (int i = 0; i < len; i++) {
cout << num[i] << " ";
};*/
};
if (cnt < k) {
len -= (k - cnt);
};
int start = 0;
for (int i = 0; i < len; i++) {
if (num[i] > 0) {
start = i;
break;
};
};
for (int i = start; i < len; i++) {
cout << num[i];
};
}
else {
cout << 0;
};
cout <<endl;
return 0;
};
ac了