您的位置:首页 > 其它

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

2008-02-20 23:33 218 查看
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。

【点评】

贪心法的入门题,注意好细节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐