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

原文地址:https://www.cnblogs.com/87hbteo/p/7146007.html