【贪心算法初学】删数问题

题目:

键盘输入一个高精度的正整数n(<=240位),

掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。

编程对给定的n和s,寻找一种方案,使得剩下的数最小。

Simple Input
 178543
 4
Simple Output
 13
 
 
首先:N超过200位,肯定要用字符串数组来进行存储。我们知道字符串数组隐含的'\0'作为结束符。当然,我们也可以用strlen()函数来直接计算字符串长度。

第二步,如何删除数字。假定只删除一个数字。每一步总是选择一个使剩下的数最小的数字删除,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字;否则删除第一个递减区间的首字符,这样删一位便形成了一个新的数字串。然后回到串首,按上述规则再删除下一个数字。这样循环删除s个数字即可完成。

还要注意一点的是,每删除一个数字,就要从这个数组的第一个单元开始重新判断。所以,用当型循环比较合适。每判断到一个可以删除的数,就结束判断。

本题难度不大,但是要理解贪心算法的本质:从问题的某一个初始解出发,向给定的目标推进。推进的每一步做一个当时看似最佳的贪心选择。不断的将问题规模缩小。并由所有的局部最优选择产生一个全局最优解。

 

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

int main()
{
	string n;
	int s, i, x, len;
	cin >> n >> s;
	i = -1, x = 0;
	len = n.length();
	while(x < s)
	{
		i++;
		if(n[i] > n[i+1])  //出现递减,删除递减的首字母 
		{
			n.erase(i, 1);
			x++;          //x统计删除数字的个数
			i = -1;       //从头开始查递减区间 
		}
	}
	i = 0;
	while(n[i] == '0')
	{
		i++;
	}
	cout << n.substr(i, len) <<endl; 
	return 0;
} 


 



 

你可能感兴趣的:(【贪心算法初学】删数问题)