• 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
  • 相关阅读:
    重写gallery 的 BaseAdapter
    excel数据导入DB
    更换 字体
    Android Activity跳转 Intent
    mpax5.0比mapx4.51多了些什么功能?
    [转载]INET控件的几点使用
    [转载]GIS基本概念集锦
    [转载]Microsoft.XMLHTTP对象
    等值线的绘制
    [转载]关于webbrowser,innet,xmlhttp获取网页源码的比较!
  • 原文地址:https://www.cnblogs.com/jihe/p/4883573.html
Copyright © 2020-2023  润新知