寻找水王问题

题目:

三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

思路:

开始的时候我想了一个特别偏的方法,因为题目中有一句话是每个帖子里面都有水王回复楼层,所以在帖子里面寻找出现id次数最多的那就是水王,但是这样下来的话工作量特别的大,不仅是每个帖子之间要比较而且每个帖子之内还是要比较,后来同学们提供了那个思路,我觉得比我的更简化,所以我才用了他的思路,我简单介绍一下这个思路吧,水王发帖数目超过了所有帖子数目的一半,每次从列表中删除两个不同的ID,那么剩下的ID里面,水王的ID出现次数仍然超过剩余数目的一半,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID。这个思路确实挺简单的。

代码。

#include<iostream>
using namespace std;

int find(int* p, int n)
{
    int a = 0,b=0;
    for (int i = 0; i < n; ++i)
    {
        if (a == 0 || b == 0)
        {
            a = p[i];
            b++;
        }
        else if (p[i] == a)
            b++;
        else
            b--;
    }
    return a;
}
int main()
{
    int i = 0, n, m[100];
    cout << "输入帖子数目:";
    cin >> n;
    cout << "输入所有帖子ID:";
    for (i = 0; i < n; i++)
    {
        cin >> m[i];
    }
    int k = find(m, n);
    cout << "水王的ID是:"<<k<<endl;
    return 0;
}

好的想法要借鉴,也要有自己的想法,即使是错的也是有意义的。

原文地址:https://www.cnblogs.com/jump/p/4536509.html