删数问题
D14553. 删数问题
时间限制:1.0s 内存限制:256.0MB
输入文件名:test.in 输出文件名:test.out
问题描述
键盘输入一个高精度的正整数n(<=240位),去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。
输入格式
n
s
输出格式
最后剩下的最小数
样例输入
178543
4
样例输出
13
思路:
愚昧的贪心策略:每次删去最大的一个数。
可以举出反例:n=23619,s = 1。若如删9,得2361。然而最小为删6,得2319。
正确的策略:删峰。即删去第一个比下一位数大的一个数。
不会证明。
使用string中的删除函数快速实现。记得删前导零。
Code:
#include<bits/stdc++.h> using namespace std; string num; int k; int main(){ freopen("test.in","r",stdin); freopen("test.out","w",stdout); cin >> num; cin >> k; while (k--) { int len = num.size(); for (int i = 0; i < len; i++) if (num[i] > num[i + 1]) { num.erase(i,1); break; }//删峰 int p = 0; while(num[p] == '0') p++; num.erase(0, p);//删前导0 } if (num.empty()) cout << 0 << endl; else cout << num << endl; return 0; }