找水王2

一、题目:

  随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的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 30 网上查找资料  
 5/24  18:00  18:30  0  30  阅读书籍 《梦断代码》 
  22:  15 22:  45 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 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,为了降低时间复杂度,老师提示用两两消除的思想,后来我们就想到了如何解决。由此可见,我们的思路还不是很开阔,只局限于那些 自己学过的简单的常用的知识,所以我还有很大的进步的空间。通过对找水王题目的扩展,举一反三解决多个水桶的问题。课下应该多练习才能做到熟能生巧。

posted on 2016-05-27 16:05  L养一只猫  阅读(147)  评论(0编辑  收藏  举报

导航