高精度整数去位去最小问题

FJNU.1403

Description
键盘输入一个高精度的正整数N,去掉其中任意M个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和M寻找一种方案使得剩下的数字组成的新数最小。输出组成的新的正整数。(不超过240位)
输入数据均不需判错。
如果去掉了某几个位后得到的新整数开头为0,保留0。

Input
本题有多组测试数据,每组测试数据占一行。
一个高精度正整数N(N不超过240位)一个正整数M。(M为不大于N的长度的正整数)
N,M由一个空格分开。

Output
新的正整数,每组数据的输出占一行。不要多余的空白.

Sample Input
456547 1
456547 2
456547 3
7773359 2
103 1

Sample Output
45547
4547
447
73359
03
 
My Program

#include < iostream >
#include
< string >
using   namespace  std;

int  main()
{
    
string num;
    
int m,n,i;
    
while(cin>>num)
    
{
        cin
>>m;
        n
=num.size();
        
if(n==m)
            cout
<<0<<endl;
        
else
        
{
            
while(m)
            
{
                i
=0;
                
while(i<n&&num[i]<=num[i+1])
                    i
++;
                num.erase(i,
1);
                m
--;
            }

            cout
<<num<<endl;
        }

    }

    
return 0;
}

YOYO's Note:
┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄它是华丽的分隔线

【题意简述】

一个高精度数N,去掉其中的M个数字,找出去掉数字后的所有情况中最小的数。


【算法分析】

观察样例可以发现,每一次删除的数字,都是第一个递减区间的第一个数字。
因此,我们每次都可以从i开始,找i>i+1的第一个数,删除所得到的就是我们要的结果。
由于每一步都满足了“局部最优解”的特性,这是一个典型的贪心问题。
又因为它是高精度的数字,所以用字符串来存储。


【C++源代码】

#include < iostream >
#include
< string >
using   namespace  std;

int  main()
{
    
string num;
    
int m,n,i;
    
while(cin>>num)
    
{
        cin
>>m;
        n
=num.size();
        
if(n==m)
            cout
<<0<<endl;
        
else
        
{
            
while(m)
            
{
                i
=0;
                
while(i<n&&num[i]<=num[i+1])
                    i
++;
                num.erase(i,
1);
                m
--;
            }

            cout
<<num<<endl;
        }

    }

    
return 0;
}

【注意事项】

※ 题目中提到去掉某几个位数后开头为0,保留0。
※ 当n==m时,就是把所有的都删除,这时输出应为0,而不是空行。
※ 可能不存在递减区间,i要判定小于n。


【点评】

 贪心法的入门题,注意好细节。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值