zoukankan      html  css  js  c++  java
  • 删数问题

    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  }

    完结,撒花~~

  • 相关阅读:
    [javaSE] 看博客学习多线程的创建方式和优劣比较和PHP多线程
    [javaSE] 看知乎学习反射
    [javaSE] 看知乎学习工厂模式
    [android] 新闻客户端主界面部分
    [PHP] 看博客学习观察者模式
    [javascript] 看知乎学习js事件触发过程
    [javascript] 看知乎学习js闭包
    [PHP] 看博客学习插入排序
    [android] ndk环境的搭建
    [android] 看博客学习hashCode()和equals()
  • 原文地址:https://www.cnblogs.com/sbwll/p/12960407.html
Copyright © 2011-2022 走看看