题目:
键盘输入一个高精度的正整数n(<=240位),
去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。
编程对给定的n和s,寻找一种方案,使得剩下的数最小。
Simple Input 178543 4Simple 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; }