课堂练习-找水王(续)

一、题目

  随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的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

编写程序

作业

七、个人总结

  这次找水王程序的思路,和原来找水王的是一样的,都是采用互消的方法,只不过由两两互消变为了四个四个的消。我们以后解决程序问题时要注意迭代以往做过的程序,把问题的难度降低,再完成简单任务的基础上完成更难的任务。

原文地址:https://www.cnblogs.com/a1397240667/p/5532820.html