码迷,mamicode.com
首页 > 其他好文 > 详细

软件工程概论---找水王问题

时间:2015-05-16 11:48:10      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

1,题目:

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

2,思路:

因为风闻该“水王”发帖数目超过了帖子数目的一半,每次从列表中删除两个不同的ID,那么剩下的ID列表中,“水王”的ID出现次数仍然超过剩余数目的一半,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID。所以所有帖子从第一个帖子开始遍历,定义一个计数变量b,第二个帖子与第一个帖子相比较,如果相同则b+1;如果不相同则b-1。

3,代码:

#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;
}

 

4,截图:

技术分享

5,总结:

一个项目往往有很多要求,我们在思考项目的实现的同时,也要考虑O(n)的最简单方法。

我们往往执着于第一直觉的被禁锢住思想的解决方法,比如这道题我一开始的思路是分别计数所有的ID,完全没想到现在的这个思路。所以发散和开拓思维很重要。

软件工程概论---找水王问题

标签:

原文地址:http://www.cnblogs.com/15732115368zhm/p/4507496.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!