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 < 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 < 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。
【点评】
贪心法的入门题,注意好细节。