• [FZYZOJ 1320] la


    P1320 -- la

    时间限制:1000MS

    内存限制:131072KB

    Description

    la在纸条上把n个16进制数写成一行,由于某种原因只能保留k个,这k个数原来的相对次序保持不变,希望得到尽量大的数。

    Input Format

    包含多组测试数据。

    每组测试数据,第一行是n, k,第二行是空格分开的n个16进制数。

    Output Format

    每组数据输出一行,表示最大的数字。注意:不含空格!

    Sample Input

    4 2
    9 a b c
    6 3
    1 a 2 b 3 c
    

    Sample Output

    bc
    b3c
    

    Hint

    共有478组测试数据,每组n, k不超过10000。

    【题解】

    建一个栈,要让最后大,肯定是大的字符摆在前,如果当前字符大于栈顶元素,那么出栈。

    要注意的是:如果一个元素出栈后,剩下凑不足k个,则不能出栈。

    本题好!卡STL模板,我第一次提交用STL_stack,TLE了!

    然后手写了栈(反正不难=-=),加了读入优化2.0,成功升至本题rank1.

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,k,top; char x;
     4 char s[10010];
     5 char B[1<<15],*S=B,*T=B;
     6 char getchar2() {
     7     return S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?0:*S++;
     8 }
     9 int read() {
    10     int x=0,f=1;
    11     char ch=getchar2();
    12     while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar2();}
    13     while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar2();}
    14     return x*f;
    15 }
    16 int main() {
    17     for (int i=1;i<=478;++i) {
    18         n=read();k=read();
    19         memset(s,0,sizeof(s));
    20         top=0;
    21         for (int i=1;i<=n;++i) {
    22             x=getchar2();
    23             getchar2();
    24             while (top&&x>s[top]&&top+n-i>=k) top--;
    25             if(top<k) s[++top]=x;
    26         }
    27         for (int i=1;i<=k;++i) printf("%c",s[i]);
    28         printf("
    ");
    29     }
    30 }
    View Code
    这篇文章由TonyFang发布。 所有解释权归TonyFang所有。 Mailto: tony-fang@map-le.net
  • 相关阅读:
    Eclipse中用两个控制台测试网络通信程序
    c++ primer 11 泛型算法
    c++ primer 10 关联容器
    c++ primer 9 顺序容器
    c++ primer 8 标准IO库
    安装使用
    InfluxDB介绍
    proxy.go
    monitor.go
    balancer.go
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/fzyzoj1320.html
Copyright © 2020-2023  润新知