zoukankan      html  css  js  c++  java
  • 找水王

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

    二、设计思路

    •   首先看到这道题,最基础的解法就是统计每个id发帖的数量,最后比较大小,这样就可以找到“水王”,不过,无疑这种方法是最麻烦的,时间复杂度为O(n^2);
    • 那么,要降低复杂度,就要考虑到这个题目的条件,“水王”发帖超过了帖子数目的一半,那么如果对所发帖子的ID进行排序,那么居中的ID必然是水王,这样便诞生了第二种解法,不过时间复杂度为O(n*log^n);仍然不是很理想
    •   为了使时间复杂度为O(n),我们可以对所有的ID进行计数,从第一个开始,计数为single=0,标记为ID0;向后遍历,如果ID1与ID0相同,那么singl+1(相当于对相同ID计数一次),否则single—1(相当于不再考虑该ID,直接删除),r如果single=0的话,标记为ID(x);最后结果即为ID(x);

    三、源代码

    • // waterking.cpp : 定义控制台应用程序的入口点。
      //
      
      #include "stdafx.h"
      #include"iostream"
      using namespace std;
      
      void Data(int length,int A[])
      {
          cout<<"请输入ID列表:"<<endl;
          for(int i=0;i<length;i++)
          {
              cin>>A[i];
          }
      }
      
      int main()
      {
          int length;
          int single=0;
          int ID;        //设置信号量
          cout<<"请输入帖子数量:";
          cin>>length;
          int * waterking=new int [length];
          Data(length,waterking);
          for(int i=0;i<length;i++)
          {
              if(single==0)
              {
                  ID=waterking[i];
                  single++;
              }
              else if(waterking[i]==ID)
              {
                  single++;
              }
              else
              {
                  single--;
              }
          }
          cout<<"水王为:"<<ID<<endl;
          return 0;
      }

      四、实验结果

      五、结果分析

        这是很典型的要求算法优化,代码也不长,主要是考虑应该用什么样的方法实现,要怎样去实现代码的优化。要实现代码的优化,首先要解决的是找到问题解决的核心,从核心入手,才能有思路去探讨解决问题的途径。这道题中,根据条件我们可以知道,半数以上帖子都是一个ID的,所以,只要找到中间的值,就能找到所谓的水王,但是,这样的优化还不够完美,要将他的时间复杂度降为O(n^2),就要考虑相同ID和不同ID之间的关系,对于不同的ID,直接摒除,那么就可以排除水王的存在,因为水王发帖数足够大,那么最后剩下的肯定是水王。

        这个题中,代码的优化过程不是一蹴而就的,而是逐步的思考深入,找到问题的关键点才渐渐实现理想的优化过程。而这个过程,恰恰是我们需要关注的。

  • 相关阅读:
    2019牛客暑期多校训练营(第三场)D Big Integer
    ZOJ2432 Greatest Common Increasing Subsequence(最长公共上升子序列)
    AGC031 C
    UPC11456 视线(计算几何)
    tmp
    jQuery与Ajax
    JQuery介绍
    Week12(11月25日)
    Week11(11月21日)
    Week11(11月19日):补课
  • 原文地址:https://www.cnblogs.com/hujinhui/p/5509744.html
Copyright © 2011-2022 走看看