• SOJ4389 川大贴吧水王 队列


    描述

    _L的室友HZ喜欢在川大贴吧上发帖,据传说,HZ在川大贴吧上发的贴子数已经超过了该贴吧贴子总数的一半,被江湖人封为川大贴吧水王,你能帮_L迅速找出这位川大贴吧水王HZ的ID吗?

    已知川大贴吧贴子总数为n,给出n个贴子作者的ID,求HZ的ID。

    Input

    输入文件包含多组测试数据。第一行为测试的数据组数T(T<=40)。
    接下有T组数据,第一行输入贴子总数n(1<=n<=10000000),接下来的一行有n个正整数,分别为每位贴子作者的ID号(该ID号为不超过10^9的正整数)
    

    Output

    输出T行,每行为该组测试数据的川大贴吧水王HZ的ID。
    

    Example Input

    2
    3
    1 2 2
    5
    1 2 3 3 3

    Example Output

    2
    3

     (原题戳我)

    思路:

    本题的题目类型很像《编程之美》那本书中的找水王的题目,最朴素的方法是将所有帖子的ID之后排序,找出中位数,但是由于本题数据规模太大,所以如果这么做的话会超时,于是可以利用队列来解题。每次读入一个数就把他和队列中现存的数进行比对,如果一样就放进队列中,不然就把队列最前面的数删除。因为水王的帖子总数过半,所以无论怎么样都可以保证最后留下的是水王的ID,等读取完毕后,取出队列中的首元素即可。

    AC代码:

    #include <stdio.h>
    #include <queue>
    #include <algorithm> 
    #include <iostream>
    using namespace std;
    
    queue<int> que;
    
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            while(que.size()){
                que.pop();
            }
            int n;
            scanf("%d",&n);
            int temp;
            for(int i=0;i<n;i++){
                scanf("%d",&temp);
                if(que.empty()){
                    que.push(temp);
                }else if(que.front()==temp){
                    que.push(temp);
                }else {
                    que.pop();
                }
            }
            int res=que.front();
            printf("%d
    ",res);
        }
        return 0;
    } 

    相似题目:

    HDU1029 Ignatius and the Princess IV

  • 相关阅读:
    查看程序设计语言排行榜的网站
    转:Android开发实践:用脚本编译Android工程
    ant 自动构建血泪史
    Android ant自动打包 crunch 报错
    android strings.xml 报 is not translated in af,
    HDU 5319
    hdu4405--Aeroplane chess(概率dp第七弹:飞行棋游戏--2012年网络赛)
    Linux 截图
    西工大10级保研机试 柱状图
    Codeforces Round #256 (Div. 2) B. Suffix Structures(模拟)
  • 原文地址:https://www.cnblogs.com/87hbteo/p/7146007.html
Copyright © 2020-2023  润新知