删数问题

【题目描述】

输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小。

输出新的正整数。(n不超过240位)

输入数据均不需判错。

【输入】

n

s

【输出】

最后剩下的最小数。

【输入样例】

175438
4

【输出样例】

13


这个题有个大坑!
我就先想到是删最大的数,
剩下小的就行了;
其实不然,
我们看几组数据,
125448
如果是删“8”的话,
余下12544;
如果删“5”呢?
泽余12448;
显然删5合适,
因为我们删掉一位数字,
相当于把这位数放在个位,
然后/10,
也就是整体向右移;
所以怎样才能最小呢?
这里用贪心法,
我们从高位往低位一步一步走,
如果高位比低位的大,
就删这个高位的,
举个例子,
12547,
5>4,
我们就删5,
而不是7;
我们想一下,
余下的数字,
是不是越高的位数数值越小,
这个数就越小?
所以,当高位数>低位数时,
删掉这个大的,
就可以求得最后结果。
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int main()
 5 {
 6     int s;
 7     char n[250];
 8     cin>>n>>s;
 9     int lenn=strlen(n);
10     for(int i=1;i<=s;i++)
11     {
12         for(int j=0;j<lenn-1;j++)
13         {
14             if(n[j]>n[j+1])
15             {
16                 for(int k=j;k<lenn-1;k++)
17                 n[k]=n[k+1];
18                 break;
19             }
20         }
21         lenn--;
22     }
23     int a=0,m=lenn;
24     while(n[a]==48&&m>1)
25     {
26         a++;
27         m--;
28     }
29     for(int i=a;i<lenn;i++)
30     cout<<n[i];
31     return 0;
32 }

每日打卡 O(∩_∩)O~

看不见我看不见我看不见我
原文地址:https://www.cnblogs.com/sxy2004/p/11494861.html