水王02

思路:

     水王的发帖量都超过1/2,假设水王的ID为开始第一个发帖人的id,则开始遍历发帖人的id,如果相同则n+1,如果不同则n-1,因为水王的发帖量超过1/2,则n到最后也是大于0的。

步骤:

  1. 可以假设帖子的第一个id是次数最大的,用ID记录,次数用n记录。

  2. 遍历下一个ID,如果跟ID一样,n++,否则,遇到一个挑战,则n--,如果n == 0,下一步就要重复第一步了。

  3.遍历结束,n>0的那个ID就是水王id,他是水王。

同理三个水王的问题也可以如此。

源代码:

#include <iostream>
using namespace std;

void main()
{
    int i,n[3]={0},id[20],ID[3]={0};//n是记录水王id的遍历次数,ID是假设的水王id,id是发帖人id
    cout<<"请输入发帖人id:"<<endl;
    for(i=0;i<20;i++)
    {
        cin>>id[i];
    }
    for(i=0;i<20;i++)
    {//假设第一个id是水王
        if(id[i]==ID[0])
        {
            n[0]++;
        }
        else if(id[i]==ID[1])
        {
            n[1]++;
        }
        else if(id[i]==ID[2])
        {
            n[2]++;
        }
        //重新开始给ID赋值
        else if(n[0]==0)
        {
            n[0]=1;
            ID[0]=id[i];
        }
        else if(n[1]==0)
        {
            n[1]=1;
            ID[1]=id[i];
        }
        else if(n[2]==0)
        {
            n[2]=1;
            ID[2]=id[i];
        }
        //假设错误则记录数减一
        else
        {
            n[0]--;
            n[1]--;
            n[2]--;
        }
    }
    cout<<"三个小水王id分别是:"<<ID[0]<<","<<ID[1]<<","<<ID[2]<<endl;
}

截图:

总结:

  我们在解决问题时,要先找到问题的关键,就像水王问题一样,水王的发帖量超过一半,那么我们就可以从这个方向入手,先假设水王的id为ID计数n为0,给他赋值和其他id比,如果相同,则n+1,如果不同则删除这两个id,因为水王的发帖量超过一半,因此剩下的一定是水王的id,同理三个水王问题其实就是大水王的问题,不要被表面的问题所迷惑,要透过表面看本质。

posted @ 2016-05-27 17:53  沙漠绿鹰  阅读(143)  评论(0编辑  收藏  举报