题目大意:给出一个n位数的数字,要求你删掉m位,使得最后的n-m位数达到最大
解题思路:贪心策略,肯定是最高位越大越好了。刚开始的思路是这样的,从前往后扫描,找到比当前位大的数,找到后,再往后继续扫描,看有没有比这个数更大的数,这样明显会超时的。
换种思路,什么情况下不用删除数字了,肯定是这个数的所有位是降序排序的时候,所以,我们改变策略,从后往前扫描,并标记,记录前一位的值,这样需要扫描的次数就会大大降低了
#include<cstdio>
#include<cstring>
#define maxn 100010
int mark[maxn];
char str[maxn];
int main() {
int n, m;
while(scanf("%d%d", &n, &m) == 2 && n + m) {
scanf("%s", str);
memset(mark,0,sizeof(mark));
int cnt = 0;
int pre = str[0], pre_pos = 0;
for(int i = 1; i < n; i++) {
if(!mark[i]) {
if(str[i] > pre) {
for(int j = i - 1; j >= 0; j--) {
if(!mark[j] && str[j] < str[i] && cnt < m) {
mark[j] = 1;
cnt++;
}
if(!mark[j] && str[j] >= str[i])
break;
}
}
pre = str[i], pre_pos = i;
}
}
if(cnt < m) {
for(int i = n - 1; i >= 0 && cnt < m; i--)
if(!mark[i]) {
mark[i] = 1;
cnt++;
}
}
for(int i = 0; i < n; i++)
if(!mark[i])
printf("%c", str[i]);
printf("\n");
}
return 0;
}