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

来源:互联网 发布:网络中的涵化理论 编辑:程序博客网 时间:2024/05/21 06:28

题目:

键盘输入一个高精度的正整数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;} 


 



 

0 0