软件工程随堂小作业—— 寻找“水王”(C++)

一、设计思路

(1)输入发帖ID记录表

(2)从第一个ID开始,与后续的发帖ID进行比较,若相同计数器则加一,否则减一。若计数器的数值被减为零,则重新选取当前ID开始记录比较。

(3)输出结果

二、源代码

 1 // shuiwang.cpp : Defines the entry point for the console application.
 2 //
 3
 4 #include "stdafx.h"
 5 #include "iostream.h"
 6 #define MAXSIZE 20
 7
 8 void FindWater(int ID[],int len,int &water)
 9 {
10     int counter=0;                    //计数器
11     for(int i=0;i<len;i++)
12     {
13         if(counter==0)                //若计数器为零
14         {
15             water=ID[i];            //记录下当前发帖的ID作为水王嫌疑人
16             counter++;
17         }
18         else
19         {
20             if(water==ID[i])        //若水王嫌疑人与下面的ID相同
21                 counter++;            //计数器记录下来,否则减一
22             else
23                 counter--;
24         }
25     }
26 }
27 int main(int argc, char* argv[])
28 {
29     int ID[MAXSIZE];                //发帖记录表
30     int num,WaterKing;                //发帖数目、水王
31     cout<<"请输入帖子的数量:";
32     cin>>num;
33     cout<<"请输入发帖ID:";
34     for(int i=0;i<num;i++)
35     {
36         cin>>ID[i];
37     }
38     FindWater(ID,num,WaterKing);
39     cout<<"水王是:"<<WaterKing<<endl;
40     return 0;
41 }

三、实验截图

四、心得体会

这个程序其实不难,因为最笨的方法比较简单。但是老师让我们对算法进行优化,要求时间复杂度为O(n),这就有点难度了。我一开始并没有想出来如何优化,于是老师提示我们对发帖记录表做减法,要消消乐。我和同桌讨论出了一种相邻ID不同则消的算法,我们测试了几组数据发现行之有效。就在我们沾沾自喜的时候,另一个同学提出了一种情况,这种算法无法找出改组数据的真正的水王。下课以后我思考了很久,但是都没法解决。最后我请教了别的同学,我把他的思想搞明白之后有自己写的这个程序。

时间: 2024-10-11 23:53:56

软件工程随堂小作业—— 寻找“水王”(C++)的相关文章

软件工程随堂小作业——寻找“水桶”(C++)

一.设计思想 思路与寻找一个水王相似,这次只是计数器和嫌疑人变量都设置为数组.每次选取一个ID与三个嫌疑人比较,若有相同则计数:若三个都不相同,则三个计数器都减一.若减为0,则从新赋值给嫌疑人. 二.源代码 1 // 水桶.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include "iostream.h" 6 #define M

软件工程随堂小作业——(C++)

一.设计思路 本来我的思路是根据上楼的人数和上楼的层数来计算出平均值,但是我发现这个思路不对.于是我选择了最笨的方法,复杂度为O(n2). (1)输入坐电梯的人数和要去的楼层: (2)找到输入楼层里最高的,这样可以减少遍历的次数: (3)从最低楼层开始遍历,直到最高层.内部循环计算每个人所要爬楼的层数之和,并比较找出最小的. (4)输出结果 二.源代码 1 // 电梯.cpp : Defines the entry point for the console application. 2 //

软件工程随堂小作业——随机四则运算Ⅱ(C++)

一.设计思路 设计思路已在上一篇日志中给出,此处不再赘述. 二.源代码 三.截图 四.PSP0级 记录表 项目计划总结: 周活动总结表 姓名:袁佩佩               日期: 日期       任务 听课 编写程序 阅读课本 准备考试 日总计 周日 周一 周二 周三 100 30 周四 周五 周六 周总结 时间记录表: 学生         袁佩佩                                            日期 教师        王建民          

软件工程随堂小作业——随机四则运算(C++)

一.设计思路: 1.程序的主体部分是循环输出,次数即题目数目由用户输入: 2.三个整型变量+rand函数来实现随机数四则运算,一个变量代表加减乘除,另外两个用作运算数: 3.用户体验:题目分三列,排列整洁间距适中,并且不会显示除数为0的情况. 由于一个寒假没怎么接触编程,对我来说最大的困难就是不清楚rand函数的用法以及其所在的头文件.基本功能实现之后,我又调整了一下页面.添加了srand((unsigned)time(NULL));  .因为只用rand函数的话,每次运行程序计算机产生的随机数

软件工程课堂作业——寻找水王2

一.题目 随着论坛的发展,管理员发现“水王”没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了总和的1/4.你能从发帖列表中快速找到他们吗? 二.设计思想 根据三个水王号的ID数均超过四分之一可以知道只要非水王号出现一次,水王号ID必定都对应会出现一次.则目前判断为水王号的ID出现则对应次数加一,非水王号出现一次则目前判断为水王号出现次数的均减一.运用这种算法则需要判断输入的ID号是否符合条件,通过判断最终判断出来的ID号的出现的次数之差可以判断出是否满足“发帖数量超过了

软件工程课堂作业——寻找“水王”

一.题目 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗? 二.设计思想: 由于该“水王”发帖数目超过了帖子数目的一半,可以通过相邻两个帖子的作者ID是否相同来寻找.如果相邻两个ID不同,则将两个ID略过:若相等,则判断之前是否有怀疑是“水王”的ID,如

课堂作业-寻找水王

[设计思想]   因为水王是整个论坛中发帖和回帖数加起来最多的的人,且超过总帖数的一半以上.(这里将发帖数和回帖数记在一起)使用"两两相消"的方法.将帖子的作者id纳入数组,将数组中的一个数记作疑似水王者,并记发帖数t=0.遍历数组,若数组中的数和疑似水王者id相同,使发帖数t加一.如与疑似水王者id不同,使发帖数t减一.当t=0时,将数组中当前与水王疑似者比较的数作为新的疑似水王者.循环结束,当前水王怀疑者就是水王. [代码实现] 1 2 3 4 5 6 7 8 9 10 11 12

软工作业 寻找水王 拓展

一.题目要求 随着Tan-go的发展,发现,“超级水王”没有了.统-计结-果表-明,有3个发帖很多的ID,他们的 数目都超过了 总数目N的1/4.你能从 ID列表中快速找出他们的ID吗? 二.设计思想 3个水王,他们 数都超过了总数1/4,每次删去4个不同的id,剩下的一定还是符合3个水王的发-帖数都超过1/4: 找到一个不为0的id保存其位置,然后找到第二个不为0且不与第一个相同的id的位置,依次类推,找到第四个.然后把四个赋值为0.循环执行上面,知道剩余的id都是水王的id为止 三.源代码

课堂作业值之寻找水王2

随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID.据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗 设计 思想: 与上次寻找水王一样,这次将与三个水王不同的ID都消除掉,剩下的就是三个水王的ID 程序源代码: import java.util.Scanner;public class shuiwang2 { public static void main(String args[]) { Scanner scanner=new Scanner(Syst