关闭

删数问题题解

标签: C++编程贪心算法
713人阅读 评论(1) 收藏 举报
分类:

题目描述

给定一个正整数(<=255位),从中删去n位后,使得剩下的数字组成的新数最小。

输入格式

第一行,要处理的正整数

第二行,一个整数n (n<255)

输出格式

仅一行,组成的最小的新数

 

样例输入

1027

3

样例输出

0

 

解题思路:

删除指定个数的数字,使得剩下的数字组成的新的数数字最小。从题目上看这道题很简单就是删除数字让剩下的部分为一个最小的数,很明显使用贪心策略就可以了,每次选一个最大的数组删掉就行了。这里还要注意一个问题,对于输入数据可能存在相等的数字,我们在删除过程中要按一定顺序。那么这个顺序的选定是一个关键。我们要从最高位(最左边)开始选,为什么呢?

拿一个例子来说明:比如输入9989  2,如果从低位开始删,那么会变为98。显然这并不是最小的,最小的应该为89,所以我们要从高位向下进行。对于输入数据,从第一位开始,比较它和它的下一位,如果每一个数字为升序排列,那么删除最后一位。如果下一位为降序,那么删除此时这一位,直到完成指定位数的删除。这题还有一点要注意的,就是可能再删除完成后会存在0在首位的情况,那么要删除前面的0。不能存在002这样的情况。还有就是删除后不能改变每个数字的排列顺序。比如本来是435,不能变成345(话说这里让我错了好几次……)。

 

AC代码:

#include<iostream>

#include<cstring>

using namespace std;

 

int main()

{

  string STR;

   cin>>STR;

     STR+='e';         //末尾标记

     intN;

     cin>>N;

     intcnt=0;

     inti=0;

     while(cnt<N)

     {

         if(STR[i]>STR[i+1])     //产生递减

         {

              STR.erase(i,1); //删除递减位的前一位

              cnt++;

              i=-1;  //恢复到开头

         }

         if(STR[i]=='e')

         {

              STR.erase(i-1,1);    //到达末尾 删除最后一位

              cnt++;

              i=-1;  //恢复到开头

         }

         i++;

     }

     STR=STR.substr(0,STR.length()-1);      //删除末尾标记

     intk=0;       //删除先导0

     while(STR[k]=='0')

         k++;

     STR=STR.substr(k,STR.length()-k);

     if(!STR.length())     //如果只含有0

         cout<<'0' <<endl;             //输出0

     else

         cout<<STR<<endl;

     return0;

}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10452次
    • 积分:411
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:0篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论