欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

删数问题

最编程 2024-05-07 16:20:45
...

Description

面对任意一个整数,如果我们需要删除掉其中的几位,怎样才能保证输出的数值最小呢?

Input

输入的第一行包含一个正整数,数字的总位数不超过1000位;第二行包含一个正整数n。表示要从第一行的数值中删除n位数字(0 < n < 1000)

Output

输出从输入的数值中删掉n位后能够产生的最小整数
注意结果不能有前置的零。

Sample Input

1372123
3

Sample Output

1123

在家无聊切了一道简单的贪心水题以下思路来自这里http://blog.****.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  }

完结,撒花~~

#include<bits/stdc++.h>using namespace std;int main(){    char n[1001];    int l,s;    cin>>n>>s;    l=strlen(n);    for(int i=1;i<=s;i++)    {        for(int j=0;j<l-1;j++)            if(n[j]>n[j+1])            {                for(int k=j;k<l-1;k++)                n[k]=n[k+1];                break;            }            l--;    }    int x=0;    int m=l;    while(n[x]=='0'&&m>1)    x++,m--;    for(int i=x;i<l;i++)    cout<<n[i];    return 0; }

原文地址:https://www.cnblogs.com/sbwll/p/12960407.html

上一篇: 安卓 4.4 删除短信

下一篇: