水王练习1
1、实验题目
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
2、实验思路
开始看到这个题目根本不知道什么意思,也不知道这样一个问题该如何用程序解决,后来在老师的分析下才懂了这个题目的意思,相当于给了你很多个每个帖子对应的id,其中有一个id出现的次数要超过帖子总数的一半,让我们找出这个id。
一开始我相信很多人的想法都和我一样,就是对每一个id出现的次数进行计数,从中找出那个出现次数最多的id,这应该是最笨的方法,当然这样的话程序的时间复杂度便会增大,其实这道题有一个特殊的地方就是这个水王发帖的数目超过了总数的一半,他的数量是做多的,而更特殊的是”超过总帖子的一半“,由此在老师的提醒下进行两两消除,从而得到一个更快速的解法,即两两比较相同则保留,不同则消除。
3、实验代码
1 #include<iostream> 2 using namespace std; 3 4 int main() 5 { 6 int length,i,id; 7 int ID[10000]; 8 cout << "请输入帖子的总个数:"; 9 cin >> length; 10 11 cout << "请依次输入每个帖子的发布者的ID:" << endl; 12 for (i = 0; i < length; i++) 13 { 14 cin >> id; 15 ID[i] = id; 16 } 17 18 int n = 0, shuiwang; 19 20 for (i = 0; i < length; i++) 21 { 22 if (n == 0) 23 { 24 shuiwang = ID[i], n = 1; 25 } 26 else 27 { 28 if (shuiwang == ID[i]) 29 { 30 n++; 31 } 32 else 33 { 34 n--; 35 } 36 } 37 } 38 cout << "水王的ID是:" << shuiwang<<endl; 39 return 0; 40 }
4、实验测试截图
5、时间记录日志(单位:h):
日期 | 开始时间 | 结束时间 | 中断时间(min) | 净时间(min) | 活动 | 备注 |
星期一 | 14:00 | 15:50 | 10(课间) | 100 | 听课 | 软件工程 |
星期二 | 20:00 | 22:00 | 0 | 120 | 编程 | 水王1 |
星期三 | 15:00 | 17:00 | 10(休息) | 120 | 看书 | 人月神话 |
星期四 | 14:00 | 15:50 | 10(课间) | 100 | 上机 | 水王1 |
20:00 | 21:30 | 10(休息) | 80 | 编程 | 水王1 | |
星期五 | 18:30 | 19:10 | 10(休息) | 30 | 发博客 | 水王1 |