课堂练习-找水王(续)

一、题目

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

周总结

10010060   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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值