删数问题题解

题目描述

给定一个正整数(<=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;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值