删数问题
【题目描述】
输入一个高精度的正整数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~
看不见我看不见我看不见我