一、题目:
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗
二、设计思路:
和原来的想法一致,用相互抵消的方法。上次是1人超过一半,现在是4人超过1/4,所以对于(n-1)人超过1/n都是可以算的。思想是这样的,每次去掉n个不同,当剩下ID没有n个不同时,剩下的就是要找的ID。
三、程序代码:
1 #include "iostream" 2 using namespace std; 3 #define MAXSIZE 30 4 5 void FindWater(int ID[], int len,int water[]) 6 { 7 int counter[3]; //计数器 8 counter[0]=counter[1]=counter[2]=0; 9 water[0]=water[1]=water[2]=-1; //初始化嫌疑人列表10 for(int i=0;i>num;54 cout<<"请输入发帖对应的所有的ID:";55 for(int i=0;i >ID[i];58 }59 FindWater(ID,num,WaterKing);60 cout<<"水桶是:";61 for(int i=0;i<3;i++)62 {63 cout< <<" ";64 }65 cout<
四、运行截图
五、项目计划日志
日期&&任务 | 听课 | 编写程序 | 阅读相关书籍 | 网上查找资料 | 日总计 |
周一 | 100 | 30 | 30 | 160 | |
周二 | 30 | 30 | 60 | ||
周三 | 30 | 30 | 10 | 70 | |
周四 | 100 | 20 | 30 | 150 | |
周五 | 120 | 30 | 30 | 180 | |
周六 | |||||
周日 | |||||
周总计 | 200 | 170 | 150 | 100 | 620 |
时间记录日志
5/23
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
5/23 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程上课 |
21:04 | 21: 34 | 0 | 30 | 阅读书籍 | 《梦断代码》 | |
22:10 | 22: 40 | 0 | 30 | 网上查找资料 | ||
5/24 | 18:00 | 18:30 | 0 | 30 | 阅读书籍 | 《梦断代码》 |
22: 15 | 22: 45 | 0 | 30 | 网上查找资料 | ||
5/25 | 19: 25 | 20: 00 | 5 | 30 | 编写程序 | 找水王2 |
22:00 | 22: 30 | 0 | 30 | 阅读书籍 | 《梦断代码》 | |
22:40 | 22: 50 | 0 | 10 | 查找资料 | ||
5/26 | 14:00 | 15: 50 | 10 | 100 | 上课 | 软件工程上机 |
18:26 | 18: 50 | 4 | 20 | 编写程序 | 找水王2 | |
22:00 | 22:30 | 0 | 30 | 阅读书籍 | 《梦断代码》 | |
5/27 | 14: 00 | 16: 20 | 20 | 120 | 编写程序 | 找水王2 |
11:23 | 12: 00 | 7 | 30 | 网上查找资料 | ||
21:00 | 21:30 | 0 | 30 | 阅读书籍 | 《构建之法》 |
六、个人总结
对于这个题目,一开始的思路,我想也是多数同学会有的思路,就是排序嘛,大不了就一个一个的找然后再逐个累加算出他们的ID号出现的总数,但是这个方法无论是在复杂度还有许多方面都不够简便,然后在老师的提示下“相减”,然后有了新的思。后来老师提到了遍历然后排序,中间项肯定是水王ID,可是时间复杂度为n*n,为了降低时间复杂度,老师提示用两两消除的思想,后来我们就想到了如何解决。由此可见,我们的思路还不是很开阔,只局限于那些 自己学过的简单的常用的知识,所以我还有很大的进步的空间。通过对找水王题目的扩展,举一反三解决多个水桶的问题。课下应该多练习才能做到熟能生巧。