描述
输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小。
输出新的正整数,若输出前有0则舍去。(n不超过240位)
输入数据均不需判错。
格式
输入格式
n 和 s
输出格式
一个正整数,即最少需要的组数。
样例
输入样例
175438 4
输出样例
13
限制
时间限制: 1000 ms
内存限制: 65536 KB
一开始没有看清楚和理解 “去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数” 这句话的意思,直接惯性思维进行排序,结果肯定WA。贪心思路:从左往右删,前者比后者大,那么就删除前者,比如:n=100534 s=2,过程是1比0大,删除1,5比3大,删除5结果是0034,将多余的00去掉,然后的结果34。
#include <iostream>
#include <queue>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int a[245], count=0, s, leng;
string ss;
memset(a, -1, sizeof(a));
getline(cin, ss);
scanf ("%d", &s);
for (int i=0; i<ss.length(); i++) {
a[i] = ss[i] - '0';
}
leng = ss.length();
for (int i=0; i<s; i++) { //循环s遍
for (int j=0; j<leng-1; j++) {
if (a[j] > a[j+1]) {
for (int k=j; k<leng-1; k++) { //删除
a[k] = a[k+1];
}
break;
}
}
leng--;
}
for (int i=0; i<leng && a[i]==0; i++) { //记录多余0的数目
count++;
}
if (count == leng) { //全为0时
printf ("0");
} else {
for (int i=count; i<leng; i++) {
printf ("%d", a[i]);
}
}
return 0;
}