高精度整数去位去最小问题
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。
【点评】
贪心法的入门题,注意好细节。
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。
【点评】
贪心法的入门题,注意好细节。
相关文章推荐
- 高精度整数去位去最小问题
- 高精度整数去位去最小问题
- 高精度整数去位去最小问题
- fjnu 1403 高精度整数去位去最小问题
- 高精度整数去位去最小问题
- 1403高精度整数去位去最小问题
- ”高精度整数删去若干位以使剩下的值最小“问题
- 高精度整数去位取最小问题
- 高精度整数去位取最小问题
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- * 问题描述:输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。
- 被1至20整除的最小正整数问题
- 输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对所给的n和s,寻找一种方案使得剩下的数字组成的新数最小。
- 【转】关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767
- 关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- 从一不含0的高精度正整数中去掉N个数字后按原左右次序组成一最小的数
- 【组合问题】 0~9 组成的小于K的最小整数
- 回文数、整数输出,数字序列最小分割问题
- 排序,求几个最值问题,输入n个整数,输出其中最小的k个元素。
- 一个数据库问题--寻找T1表中keycol列缺少的最小正整数