• 水王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,同理三个水王问题其实就是大水王的问题,不要被表面的问题所迷惑,要透过表面看本质。

  • 相关阅读:
    HDU5000 (DP + 规律)
    HDU5127 神坑题---vector 、 list 、 deque 的用法区别
    HDU5128 细心、细心、细心
    dij单源最短路纯模板
    POJ 1236 SCC+缩点
    SCC(强连通分量)
    用树状数组求数组内的逆序对数
    HDU 1811 并查集
    大数模板,只要不是手敲,非常好用
    市赛
  • 原文地址:https://www.cnblogs.com/liguoshuai/p/5535575.html
Copyright © 2020-2023  润新知