一、题目及题目要求
题目:三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他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 | ||||
周三 |
30 | 30 | |||||
周四 |
100 | 100 | |||||
周总结 |
100 | 100 | 60 | 260 |
阶段时间和效率 周数(上一次周活动表的周数+1):
不包括上一周在内的累计时间
总计 |
100 |
100 |
60 |
|
|
|
260 |
平均 |
100 |
100 |
60 |
|
|
|
260 |
最大 |
100 |
100 |
60 |
|
|
|
260 |
最小 |
100 |
100 |
60 |
|
|
|
260 |
以前各周的累计时间
总计 |
100 |
100 |
60 |
|
|
|
260 |
平均 |
100 |
100 |
60 |
|
|
|
260 |
最大 |
100 |
100 |
60 |
|
|
|
260 |
最小 |
100 |
100 |
60 |
|
|
|
260 |
六、时间记录表:
学生 魏** 日期 2016年5月19日
教师 王** 课程 软件工程
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
5.16 |
14:30 |
16;20 |
10 |
100 |
上课 |
|
5.16 |
18:30 |
19:00 |
无 |
30 |
看书 |
|
5.18 |
22:00 |
22:30 |
无 |
30 |
看书 |
|
5.19 |
14:30 |
16:30 |
无 |
100 |
编写程序 |
作业 |
七、个人总结
这个题目,一开始没有思路,在老师的启发下一开始到的是遍历列表,统计每个id出现的次数。后来老师提到了遍历然后排序,中间项肯定是水王ID,可是时间复杂度为n*n,为了降低时间复杂度,老师提示用两两消除的思想,后来我们就想到了如何解决。一道题目有好多种解法,我们应当拓宽思路,多看一些算法书籍,多练习写程序,孰能生巧。