zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Python3 运算符
    Python之匿名函数
    Python之推导式、生成器表达式
    Python网络编程
    Python单例模式
    Python异常处理及元类
    Python面向对象(三)
    Python面向对象(二)
    Python面向对象(一)
    Python面向对象入门
  • 原文地址:https://www.cnblogs.com/jihe/p/4883573.html
Copyright © 2011-2022 走看看