任务:

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

1.设计思想:刚看到此题目的时候,以为水王的ID是知道,而且可以用多个变量,进行遍历,再通过一次比较将发帖最多的ID找到就行。但是要求只能有一个变量值,而且要求时间复杂度是O(n),这时候就要考虑换一种思路来解决问题了。假设这里一共有n个帖子,那么水王的帖子数是占一半以上的,就是大于n/2,如果时间复杂度要求是O(n)的话,那也就是只能遍历一次,而且只能有一重循环的结构,所以只能由那个唯一的变量进行ID数量的记录。要找到ID数是总数的一半以上的ID的话,由于每个帖子的位置都是毫无规律的,所以不能进行累加计算,因为ID是一直变化的。然后就想到可以利用加减结合,从第一个ID开始,一次对相邻的两个帖子进行比对,如果说ID相同m就加一,如果不同就减一,到最后m肯定是大于等于0的,只有当m等于0时,将ID赋值为当前ID,就能保证最后的ID是要找的ID。

2.源代码:

#include<iostream>
using namespace std; void main()
{
int i , n, ID[];
int id = ID[], num = ;
cout << "请输入帖子的数目:";
cin >> n;
cout << "输入每个帖子所对应的ID:";
for (i = ; i < n; i++)
{
cin >> ID[i];
}
for (int i = ; i < n; ++i)
{
if (num == )
{
id = ID[i];
num++;
}
else if (ID[i] == id)
{
num++;
}
else
{
num--;
}
} cout << "水王的ID是:" << id << endl; }

3.实验截图:

4.实验总结:(1)在完成每一个程序时都要仔细地研读题目的要求,看它规定的条件,如时间复杂度的要求、变量个数的要求、还有最终结果的形式要求等等诸多因素。因为某个条不一样是设计思路就会有很大的区别,所以在开始设计思路之前一定要把题目完全弄懂,不能因为一些细节而犯错误。

(2)开始的时候,在遍历所有ID的时候,我老是想着对于不相同的ID将计数的变量逐次加一,然后看最后总数大于n/2就行了,可是一想到ID一直在换而且没有规律,如果只有一个变量就无法达到目的了。过了半天才稍微想到可以利用减法计数,相同加一,不同减一,当某个临界的时候改变ID的赋值,思路雏形刚刚有了,然后有同学做了讲解,大致思路是一样的,说明我想的方向是对的。然后再考虑具体的实现过程就可以了。及时转换思路是很重要的。

(3)另外,当一个题目有简单的思路和复杂的思路时, 要多注意比较难一点的设计思路这样会让计算机的运算效率更快。

Task 8 找水王的更多相关文章

  1. 课堂练习--“找水王续"

    设计思路: ①跟上次思路一样,将问题简化成从一个数组中找出出现次数最多的3个数. ②将“两两相消"的思路模式,变成“三一相消” ③初始化time为零,kingid为零,然后按顺序赋值,遇到跟 ...

  2. Java实验--关于课上找“水王”问题分析

    问题的表述就是说有那么一个人,他在一个论坛上发帖,然后每贴必回,自己也发帖.那么这个人在发帖的数目上就超过了整个论坛的帖子数目的一半以上. 我对这个问题一开始的思路是,用SQL语句获取整个列表中的数据 ...

  3. java课程课后作业190530之找水王

    从题目中我们可以看出,水王有着相当严苛的条件才可以成为,那就是必须拥有一半的评论量才可以当上水王.当然这就是破题的关键,最简单的算法当然是用O(N平方)的复杂度的那种算法,但显然,我们需要的不是这种. ...

  4. 找出程序cpu使用率高的原因

    确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |g ...

  5. Activity的任务栈Task以及启动模式与Intent的Flag详解

    什么是任务栈(Task) 官方文档是这么解释的 任务是指在执行特定作业时与用户交互的一系列 Activity. 这些 Activity 按照各自的打开顺序排列在堆栈(即“返回栈”)中. 其实就是以栈的 ...

  6. dl learn task

    https://deeplearning4j.org/cn/word2vec Task 1 分类http://blog.csdn.net/czs1130/article/details/7071734 ...

  7. 如何定位死循环或高CPU使用率(linux)

    如何定位死循环或高CPU使用率(linux)  确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid ...

  8. 【WP开发】手电筒

    或许很多人都想到,可以利用手机上摄像头的闪光灯做手电筒,当然,有利必有害,每次使用的时间不要过长,几分钟一般不会有什么问题,如果时间太长,难保会有损伤. 以往的方案是调用视频录制功能来开始录制视频,同 ...

  9. 转载SSIS中的容器和数据流—数据转换(Transformations)续

    数据挖掘请求 数据挖掘任务是SSIS中一个很重要的任务,它的思想来源于一些算法.数据挖掘请求运行数据挖掘请求,并将结果输出到数据流.它还可以添加一些预测新列,一些应用场合如下列举: 根据已知的一些列, ...

随机推荐

  1. BFC (Block formatting context)

     一:BFC 是什么      MDN解释: A block formatting context is a part of a visual CSS rendering of a Web page. ...

  2. mysql/mariadb学习记录——创建删除数据库、表的基本命令

    查看已有的数据库: mysql> show databases; +--------------------+ | Database | +--------------------+ | inf ...

  3. js面向对象案例 贪吃蛇

    食物对象 (function () { //map:所在的父盒子,obj自身的一些属都具有默认值 function Food(map, obj) { obj = obj || {}; //没有则使用默 ...

  4. jQuery学习- 层叠选择器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. PDO访问方式操作数据库

    mysqli是专门访问MySQL数据库的,不能访问其它数据库.PDO可以访问多种的数据库,它把操作类合并在一起,做成一个数据访问抽象层,这个抽象层就是PDO,根据类操作对应的数据库.mysqli是一个 ...

  6. 【HEOI2016】序列

    题面 题解 很像最长不下降子序列对吧(废话) 设$up[i]$和$down[i]$分别表示$i$最大最小能取多少 注意到: $$ f[i] = max_j\left\{f[j]\right\} + 1 ...

  7. ELK批量删除索引

    一.存在问题 用了一段时间elk发现如果索引长时间不删除,elk会越来越慢,重启elasticsearch服务器节点之前同步时间也会很长 二.解决方法(定期删除索引) 1.在elasticsearch ...

  8. 【Java多线程】Executor框架的详解

    在Java中,使用线程来异步执行任务.Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源.同时,为每一个任务创建一个新线程来执行 ...

  9. java 或者 js 获取项目访问路径(域名)

    /** * 获得站点url * @return */ public String getWebUrl(){ String url = getRequest().getScheme() + " ...

  10. SSIS 数据流的执行树和数据管道

    数据流组件的设计愿景是快速处理海量的数据,为了实现该目标,SSIS数据源引擎需要创建执行树和数据管道这两个数据结构,而用户为了快速处理数据流,必须知道各个转换组件的阻塞性,充分利用流式处理流程,利用更 ...