一、题目及题目要求
题目:三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
二、设计思路:
1、把帖子列表,抽象为一个一维数组arr[NUM],输入长度length为id总数,每个数组元素为一个id。
2、再设置一个循环,按照顺序来依次两两比较,如果作者id相同则保留,如果作者id不同则消除。
3、最后剩下id即为水王id
三、源程序:
#include<iostream>
using namespace std;
#define NUM 100
int find(int arr[], int n)//找水王函数
{
int sw = 0; //
int count=0; //标记
for(int i=0;i<n;i++)
{
if(count == 0)//初始时,把数组第一个元素赋给sw
{
sw = arr[i];
count = 1;
}
else
{
if(sw == arr[i]) //相等不消除
count ++;
else
count --;
}
}
return sw;
}
int main()
{
int length=0;
while (length==NULL||length == 0)//如果数组长度为空或零则请重新输入
{
cout<<"请输入ID数量:";
cin>>length;
}
int arr[NUM];
cout<<"输入作者id(不为0):"<<endl;
for(int i=0;i<=(length-1);i++)
{
cin>>arr[i];
if(arr[i]==0)
{
cout<<"id不为0,请重新输入:";
cin>>arr[i];
}
}
int ID=find(arr,length);
cout<<"水军的ID是"<<ID<<endl;
return 0;
}
四、运行截图

五、项目计划日志
周活动总结表
姓名:魏** 日期2016.5.19
日期 任务 | 听课 | 编写程序 | 阅读课本 | 准备考试 | 日总计 |
周一 | 100 | 30 | 130 | ||
周三 | |||||
周四 | |||||
周总结 | 60 | 260 |
阶段时间和效率 周数(上一次周活动表的周数+1):
不包括上一周在内的累计时间
总计 | 100 | 60 | 260 | |
平均 | ||||
最大 | ||||
最小 |
以前各周的累计时间
60 | ||||
六、时间记录表:
学生 魏** 日期 2016年5月19日
教师 王** 课程 软件工程
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
5.16 | 14:30 | 16;20 | 10 | 上课 | ||
18:30 | 19:00 | 无 | 看书 | |||
5.18 | 22:00 | 22:30 | ||||
5.19 | 14:30 | 16:30 | 无 | 作业 |
七、个人总结
这个题目,一开始没有思路,在老师的启发下一开始到的是遍历列表,统计每个id出现的次数。后来老师提到了遍历然后排序,中间项肯定是水王ID,可是时间复杂度为n*n,为了降低时间复杂度,老师提示用两两消除的思想,后来我们就想到了如何解决。一道题目有好多种解法,我们应当拓宽思路,多看一些算法书籍,多练习写程序,孰能生巧。