UVa11491 Erasing and Winning 奖品的价值
程序员文章站
2022-03-11 19:22:54
...
题目
思路
类比单调栈,输入时将元素一个个插到数组末尾,由于位越高的数越大越好,每次进栈的时候做类似单调栈操作,就是一直保持数组降序单调性,同时每删去一个数耗一点d。
最后就有两种情况:
- 点数用完:后面直接进数组
- 都进了数组了却没用完点数:从后往前删(因为前面的都是挑过的够大的)
#include<iostream>
#include <math.h>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
const int maxn = 100000 + 10;
int main() {
int n, d;
string num;
int A[maxn];
while (cin >> n >> d && n) {
cin >> num;
int p = 0;
for (int i = 0; i < n; i++) {
while (d > 0 && p > 0 && A[p - 1] < num[i] - '0') { d--; p--; }//这个d很关键,多层含义在这,既控制点数又控制数字大小
A[p++] = num[i] - '0';
}
while (d > 0) { d--; p--; }
for (int i = 0; i < p; i++) {
cout << A[i] << "";
}
cout << endl;
}
}