删数问题
Description
面对任意一个整数,如果我们需要删除掉其中的几位,怎样才能保证输出的数值最小呢?
Input
输入的第一行包含一个正整数,数字的总位数不超过1000位;第二行包含一个正整数n。表示要从第一行的数值中删除n位数字(0 < n < 1000)
Output
输出从输入的数值中删掉n位后能够产生的最小整数
注意结果不能有前置的零。
注意结果不能有前置的零。
Sample Input
1372123
3
Sample Output
1123
在家无聊切了一道简单的贪心水题以下思路来自这里http://blog.csdn.net/c20190102/article/details/52350828
如果是直接删掉最大的数字,很容易便可举出反例:
1529 1
如果直接删最大的9,结果为152,如果删掉5,结果为129,显然删掉5才是最佳答案。
再看一组数据:
141519 2
如果删最大的9,5,结果为1411,如果删掉4,5,结果为1119,显然删掉4,5才是最佳答案。
发现什么了吗?
先看第一组:
1 5 1 9
小大 小 大
留删 留 留
第二组:
1 4 1 5 1 9
小 大 小 大 小 大
留 删 留删 留 留
删掉的是“山峰”,也就是比后一个数大的数,且越靠前“山峰”越早删。
大体思路也就一句话:删除靠前的“山峰”。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 char n[1001]; 6 int l,s; 7 cin>>n>>s; 8 l=strlen(n); 9 for(int i=1;i<=s;i++) 10 { 11 for(int j=0;j<l-1;j++) 12 if(n[j]>n[j+1]) 13 { 14 for(int k=j;k<l-1;k++) 15 n[k]=n[k+1]; 16 break; 17 } 18 l--; 19 } 20 int x=0; 21 int m=l; 22 while(n[x]=='0'&&m>1) 23 x++,m--; 24 for(int i=x;i<l;i++) 25 cout<<n[i]; 26 return 0; 27 }
完结,撒花~~