欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UVa11491 Erasing and Winning 奖品的价值

程序员文章站 2022-03-11 19:22:54
...

题目

UVa11491 Erasing and Winning 奖品的价值
UVa11491 Erasing and Winning 奖品的价值

思路
类比单调栈,输入时将元素一个个插到数组末尾,由于位越高的数越大越好,每次进栈的时候做类似单调栈操作,就是一直保持数组降序单调性,同时每删去一个数耗一点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;
	}
}