题解:UVA11491 奖品的价值 Erasing and Winning
题目传送门:UVA11491 奖品的价值 Erasing and Winning
upd on October 12, 2024:之前的代码超时了,现代码使用 STL 库中函数以优化程序,现在的代码保证 AC。
题目大意:
在长度为
分析:
这道题目容易有个误区,就是应该删较小的数,保留较大的数,这是错误的。
比如这组数:
如果保留较大的数,就得到
就拿
第一次删
第二次删
第三次删
第四次删
剩下的数就是
我们是如何实现的呢?
第一次删
第二次删
第三次删
第四次删
然后我们就发现每次删掉的数都是比后一个小的数。
算法:
如果
代码:
最后附上自己的代码:
#include <bits/stdc++.h>
using namespace std;
void solve(int n, int d, string num) {
vector<int> s;
for (char digit : num) {
int value = digit - '0';
while (d > 0 && !s.empty() && s.back() < value) {
s.pop_back();
d--;
}
s.push_back(value);
}
while (d-- > 0 && !s.empty()) {
s.pop_back();
}
if (s.empty()) {
cout << "0" << endl;
return;
}
for (int i = 0; i < s.size(); ++i) {
if (i > 0) cout << "";
cout << char(s[i] + '0');
}
cout << endl;
}
int main() {
while (true) {
int n, d;
cin >> n >> d;
if (n == 0 && d == 0) {
return 0;
}
string num;
cin >> num;
solve(n, d, num);
}
return 0;
}