一、题目:
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的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<len;i++) 11 { 12 if(counter[0]==0) //先赋值 13 { 14 counter[0]++; 15 water[0]=ID[i]; 16 } 17 else if(counter[1]==0) 18 { 19 counter[1]++; 20 water[1]=ID[i]; 21 } 22 else if(counter[2]==0) 23 { 24 counter[2]++; 25 water[2]=ID[i]; 26 } 27 else if(ID[i]==water[0]) //如果counter为0,重新赋值 28 { 29 counter[0]++; 30 } 31 else if(ID[i]==water[1]) 32 { 33 counter[1]++; 34 } 35 else if(ID[i]==water[2]) 36 { 37 counter[2]++; 38 } 39 else //如果与三个嫌疑人的ID都不同的话,则三个计数器都自减一,直到counter为0 40 { 41 counter[0]--; 42 counter[1]--; 43 counter[2]--; 44 } 45 } 46 } 47 48 int main(int argc, char* argv[]) 49 { 50 int ID[MAXSIZE]; //发帖记录表 51 int num,WaterKing[3]; //发帖数目、水桶 52 cout<<"请输入帖子的总数量:"; 53 cin>>num; 54 cout<<"请输入发帖对应的所有的ID:"; 55 for(int i=0;i<num;i++) 56 { 57 cin>>ID[i]; 58 } 59 FindWater(ID,num,WaterKing); 60 cout<<"水桶是:"; 61 for(int i=0;i<3;i++) 62 { 63 cout<<WaterKing[i]<<" "; 64 } 65 cout<<endl; 66 return 0; 67 }
四、运行截图
五、项目计划日志
日期&&任务 |
听课 | 编写程序 | 阅读相关书籍 | 网上查找资料 | 日总计 |
周一 | 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,为了降低时间复杂度,老师提示用两两消除的思想,后来我们就想到了如何解决。由此可见,我们的思路还不是很开阔,只局限于那些 自己学过的简单的常用的知识,所以我还有很大的进步的空间。通过对找水王题目的扩展,举一反三解决多个水桶的问题。课下应该多练习才能做到熟能生巧。