zoukankan      html  css  js  c++  java
  • fzu 1894 单调队列

    http://acm.fzu.edu.cn/problem.php?pid=1894

     Problem 1894 志愿者选拔

    Accept: 1328    Submit: 4200
    Time Limit: 1500 mSec    Memory Limit : 32768 KB

     Problem Description

    世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动。
    参加志愿者选拔的同学们排队接受面试官们的面试。参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查。
    面试中每个人的人品是主要考查对象之一。(提高人品的方法有扶老奶奶过街,不闯红灯等)
    作为主面试官的John想知道当前正在接受面试的同学队伍中人品值最高的是多少。于是他请你帮忙编写一个程序来计算。

     Input

    输入数据第一行为一整数T,表示有T组输入数据。每组数据第一行为”START”,表示面试开始
    接下来的数据中有三种情况:
      输入 含义
    1 C NAME RP_VALUE 名字为NAME的人品值为RP_VALUE的同学加入面试队伍。(名字长度不大于5,0 <= RP_VALUE <= 1,000,000,000)
    2 G 排在面试队伍最前面的同学面试结束离开考场。
    3 Q 主面试官John想知道当前正在接受面试的队伍中人品最高的值是多少。
    最后一行为”END”,表示所有的面试结束,面试的同学们可以依次离开了。
    所有参加面试的同学总人数不超过1,000,000

     Output

    对于每个询问Q,输出当前正在接受面试的队伍中人品最高的值,如果当前没有人正在接受面试则输出-1。

     Sample Input

    2
    START
    C Tiny 1000000000
    C Lina 0
    Q
    G
    Q
    END
    START
    Q
    C ccQ 200
    C cxw 100
    Q
    G
    Q
    C wzc 500
    Q
    END

     Sample Output

    1000000000
    0
    -1
    200
    100
    500

     Hint

    数据较大建议使用scanf,printf 不推荐使用STL
     
    ========================================
    有点坑爹,,,,,
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    
    typedef struct Node
    {
        int num;
        char name[10];
        int data;
    }queue;
    queue f[1000010];
    
    int main()
    {
        int n,m,i,j,tail,head;
        scanf("%d",&n);
        queue tmp;
    
        while(n--)
        {
            char cur[10];
            int Num=0,count=0;
            head=0,tail=-1;
            while(scanf("%s",cur)!=EOF)
            {
                if(cur[0]=='C')
                {
                    scanf("%s%d",tmp.name,&tmp.data);
                    tmp.num=++Num;
    
                    while(head<=tail && f[tail].data<tmp.data)
                    {
                        tail--;
                    }
    
                    f[++tail]=tmp;
                }
                if(cur[0]=='S')continue;
                if(cur[0]=='E')break;
                if(cur[0]=='Q')
                {
                            while(tail>=head && f[head].num<=count)
                            {
                                head++;
                            }
                            if(head>tail)printf("-1
    ");
                            else
                            printf("%d
    ",f[head].data);
                }
                if(cur[0]=='G')
                {
                    count++;
                }
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    <转>Java 高并发综合
    <转>Spring 知识点提炼
    qqq
    ttt
    工作中的那些坑(2)——逆波兰表达式
    工作中的那些坑(1)——一次过滤存量数据的优化过程
    Java学习笔记
    《代码大全》笔记(一)
    由Cocos2d-x工程入口窥见代理模式
    makefile
  • 原文地址:https://www.cnblogs.com/ccccnzb/p/3850983.html
Copyright © 2011-2022 走看看