题目
参考
题意:给定长度不超过1000的只包含1到9的数字,现给定要删除的数字1到数字9的数量,问怎么删除,使得剩余的数最大。
题解:贪心,但要以加数来贪,不能删数来贪。维护当前最大数,如果当前数字大于前面的数字,则考虑删去前面的数字。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1010;
char s[maxn];
int res[maxn];
int digit[10], num[10];
int main() {
scanf("%s", s);
for (int i = 1; i < 10; ++i)
scanf("%d", &digit[i]);
memset(num, 0, sizeof(num));
int n = strlen(s), m = 0;
for (int i = 0; i < n; ++i) {
++num[s[i]-'0'];
}
for (int i = 0; i < n; ++i) {
int val = s[i] - '0';
if (num[val] == digit[val]) {// 剩余数量等于待删除数量
--num[val];
--digit[val];
continue;
}
while (m && res[m-1] < val && digit[res[m-1]]) {// 末尾元素可删,则删
--digit[res[m-1]];
--m;
}
--num[val];
res[m++] = val;
}
for (int i = 0; i < m; ++i) {
printf("%d", res[i]);
}
printf("\n");
}