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]='\0'; 21 puts(ans+1); 22 } 23 return 0; 24 }