SOJ4389 川大贴吧水王 队列
Posted 87hbteo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n",res); } return 0; }
以上是关于SOJ4389 川大贴吧水王 队列的主要内容,如果未能解决你的问题,请参考以下文章