一、题目
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗
二、设计思路
参考原来问题的解法http://www.cnblogs.com/a1397240667/p/5509088.html
如果每次删除4个不同的ID(不管是否超过总数1/4的ID),那么,剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4。上题只需要一个结果,而现在需要3个结果,上题用到的counter,也应改为3个计数器。现在我们需要3个变量来记录当前遍历过的3个不同的ID,而counter的3个元素分别对应当前遍历过的3个ID出现的个数。具体方法:用candidate[3]记录三个候选ID,用count[3]记录它们的累积次数,然后遍历整个ID列表,每处理一个ID,若与candidate[i]中的某一个相同,则count[i]++,若与三个都不同,则说明找到了四个互不相同的ID,将三个count[i]--,也就相当于“删除了四个不同ID”,若某一个count[i]==0,则更新之。
三、源代码
1 /*2016.5.23 weilihua 找水王(续)*/ 2 #include<iostream> 3 using namespace std; 4 #define NUM 100 5 int main() 6 { 7 int length=0; 8 while (length==NULL||length == 0)//如果数组长度为空或零则请重新输入 9 { 10 cout<<"请输入ID数量:"; 11 cin>>length; 12 } 13 int arr[NUM]; 14 cout<<"输入作者id(不为0):"<<endl; 15 for(int i=0;i<=(length-1);i++) 16 { 17 cin>>arr[i]; 18 if(arr[i]==0) 19 { 20 cout<<"id不为0,请重新输入:"; 21 cin>>arr[i]; 22 } 23 24 } 25 26 int sw [3]={0}; 27 int count[3] = {0}; //标记变为3个 28 bool flag = false; 29 for(int i=0;i<length;i++) 30 { 31 if(arr[i]==sw[0]) 32 { 33 count[0]++; 34 } 35 else if(arr[i]==sw[1]) 36 { 37 count[1]++; 38 } 39 else if(arr[i]==sw[2]) 40 { 41 count[2]++; 42 } 43 else if(count[0]==0) 44 { 45 count[0]=1; 46 sw[0]=arr[i]; 47 } 48 else if(count[1]==0) 49 { 50 count[1]=1; 51 sw[1]=arr[i]; 52 } 53 else if(count[2]==0) 54 { 55 count[2]=1; 56 sw[2]=arr[i]; 57 } 58 else 59 { 60 count[0]--; 61 count[1]--; 62 count[2]--; 63 } 64 65 } 66 67 cout<<"水王id:"<<endl; 68 for(int i=0;i<3;i++) 69 { 70 cout<<sw[i]<<" "; 71 } 72 73 cout<<endl; 74 return 0; 75 }
四、截图
五、项目计划日志
周活动总结表
姓名:魏** 日期2016.5.26
日期 任务 | 听课 | 编写程序 | 阅读书籍 | 准备考试 | 日总计 | ||
周一 |
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月26日
教师 王** 课程 软件工程
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
5.23 |
14:30 |
16;20 |
10 |
100 |
上课 |
|
5.24 |
21:30 |
22:00 |
无 |
30 |
人月神话 |
|
5.25 |
22:00 |
22:30 |
无 |
30 |
人月神话 |
|
5.26 |
14:30 |
16:30 |
无 |
100 |
编写程序 |
作业 |
七、个人总结
这次找水王程序的思路,和原来找水王的是一样的,都是采用互消的方法,只不过由两两互消变为了四个四个的消。我们以后解决程序问题时要注意迭代以往做过的程序,把问题的难度降低,再完成简单任务的基础上完成更难的任务。