zoukankan      html  css  js  c++  java
  • 4906 删数问题(另一种贪心思路)

    4906 删数问题

     时间限制: 1 s
     空间限制: 2000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

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

      输入数据均不需要判错。 

      输出组成的新的正整数。(N不超过240位)

    输入描述 Input Description

    第一行,输入一正整数N(N<=10^240),表示要删的数;

    第二行,输入一正整数S,表示删去的个数,当然S小于N的位数。

    输出描述 Output Description

    仅一行,输出删数后形成的最小数。

    样例输入 Sample Input

    【1】

    5768

    1

    【2】

    8796542

    4

    样例输出 Sample Output

    【1】

    568

    【2】

    542

    数据范围及提示 Data Size & Hint

    1<=N<=10240

    1<=S<=239

    注意开头的0应略去!![要小心]

    思路:要求去掉s位,也就是在总长度len中去掉s个数,那么也就是保留(len-s)位数;

    设 x=len-s; 保留x位数。

    可以从第一位找,到 (后面还有 x-1 位时停止,也就是使后面只剩下(x-1)位);在这里面找到最小的数,算是第一个数;

    然后以  这个数的下一个  为起点,到(后面有x-2位时停止),也是找最小的。以此类推,找出全部的数。

    1. 那为什么找到  后面有x-1 位  ?

    举个例子:

    789456123     5 

    从  789456123  去掉5位,即保留4位数字,x=4;

    从这里面挑 4 个数,使这个数最小;那选要谁呢?

    先选最高位,最高位小的当然要小,所以选最小的做最高位;

    那么因为  最高位只能是  789456  这6个数中的一个,为什么?因为最高位最差只能是6,不能是1 2 3,还要剩下三个数做 百位,十位,个位;

    所以只能从1到  后面有3位(这不就是x-1吗!!!)时停止, 在包括的数中挑选最小的;

    选百位,十位,个位时同理。

    2.代码中16行是:end=n+1

    解释一下:以这个为例,len = 9 , s = 5 , 保留的数  x = len - s = 9 - 5 = 4 ;

    到后面还有 x-1 位,那前面有 len - (x-1) 位 (因为总长len),

    x = len - s ;len-(x - 1)=len-(len-s-1)=len-len +s +1=s+1;

    也就是 从1到 s+1位中找最小的。

     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 int num[300];
     5 string s;
     6 int len,n;        //len 长度 
     7 int ans=10,beg,end,can,p;
     8 bool flag=0;
     9 int main()
    10 {
    11     cin>>s>>n;
    12     for(int i=0;i<s.size();++i)
    13         num[i+1]=s[i]-48;        //记录下数字 
    14     len=s.size();
    15     beg=1;        //起始位置 
    16     end=n+1;    //终止位置 
    17     while(end<=len)    
    18     {
    19         ans=10;        //设置成最大 
    20         for(int i=beg;i<=end;++i)  //找出最小的一位数 
    21         {
    22             if(num[i]<ans)
    23             {
    24                 ans=num[i];
    25                 can=i;
    26             }
    27         }
    28         if(ans)  //判断0的情况 
    29         {
    30             cout<<ans;
    31             flag=1;            
    32         }
    33         else if(!ans&&flag)cout<<ans;
    34         beg=can+1;
    35         end++;
    36     }
    37     if(!flag)cout<<0;
    38     return 0;
    39 }
  • 相关阅读:
    XAML学习笔记之Layout(五)——ViewBox
    XAML学习笔记——Layout(三)
    XAML学习笔记——Layout(二)
    XAML学习笔记——Layout(一)
    从0开始搭建SQL Server 2012 AlwaysOn 第三篇(安装数据,配置AlwaysOn)
    从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)
    从0开始搭建SQL Server 2012 AlwaysOn 第一篇(AD域与DNS)
    Sql Server 2012 事务复制遇到的问题及解决方式
    Sql Server 2008R2升级 Sql Server 2012 问题
    第一次ACM
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6754316.html
Copyright © 2011-2022 走看看