uva 11491 Erasing and Winning

题意:给你一个n位数(保证首位不为0),去除m位数,要求输出此操作后的数最大

分析:首先,前面的数大比后面数大影响要大,首先要保证前面的数大,开始的思路是,首位必须是最大,那么从前n-m+1个数中选择最大的数,并且记录每次取的数的原位置,然后每次把剩下的数字依次加入,如果取出来的数的坐标在已经取了的数坐标前,抛弃,再取,直至取完所有的数,这样用优先队列写。

后来看到一个博客写的特别巧妙,每读取一个字符,如果ans中有字符,且如果删除一个字符后面的数字数量依然够的话,并且ans中最后一个数字比新读取的小,那么删除最后一个字符,把新读取的字符加入ans.

 1 #include<iostream>
 2 #include<string>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 
 7 char s;
 8 char ans[100005];
 9 int main(){
10     int d,n;
11     while(cin>>d>>n&&d&&n){
12         getchar();
13         int k=0;
14         for(int i=0;i<d;i++){
15             s=getchar();
16             while(k>0&&i-k<n&&ans[k]<s)
17                 k--;
18             if(k+n<d)ans[++k]=s;
19         }
20         ans[++k]='';
21         puts(ans+1);
22     }
23     return 0;
24 }
View Code
原文地址:https://www.cnblogs.com/jihe/p/4883573.html