寻找水王2

”……随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?“
一、设计思想
      上次上网搜到的编程思想不中也介绍了这次题目的改变,然后我又自己分析了一遍,开始下面的编程。
      首先依旧是用文件存取各个发帖id(相当于题目中说的“论坛帖子列表”),文件命名为“id_form”。
      其次,上次是找出一个水王,这个水王发帖数超过了总帖数一半;这次是找三个小水王,他们每一个人的帖子数都超过了总帖数的1/4。因此基本的思想不变,我们只需要在上次的基础上进行改进就可以。本题的关键依旧是:三个小水王发帖的总数(也就是id号码)超过总帖子数量的1/4。抓住这个条件,我们将存放疑似水王id的和存放某个id发帖数量的都设置成数组,并把前三个id号码初始化成“疑似水王”。每次选取下一个id分别与三个嫌疑人比较,若有相同则计数加1;若三个都不相同,则三个计数器都减1。若减为0,就意味着这个id号出现的次数没有超过1/4,则重新将下一个id赋值给嫌疑人,然后重复上述过程。因为三个小水王的id数大于1/4,所以到最后总会有三个id号码使得记录次数的值>0,那他们个就是真正的“小水王”。
 
二、代码实现
 1 //Zhao Ziyin 2016/5/27 寻找小水王
 2 
 3 #include<iostream>
 4 #include<fstream>
 5 using namespace std;
 6 #define MAX 50
 7 
 8 void Find(int id[], int lenth, int water[])
 9 {
10     int i = 0;
11     int count[3] = { 0, 0, 0 };             //count数组用来记录某id发帖次数
12     water[0] = water[1] = water[2] = -1;    //初始化嫌疑人列表
13     for (i = 0; i<lenth; i++)
14     {
15         if (count[0] == 0)            //初始化后先赋值
16         {
17             count[0]++;
18             water[0] = id[i];
19         }
20         else if (count[1] == 0)
21         {
22             count[1]++;
23             water[1] = id[i];
24         }
25         else if (count[2] == 0)
26         {
27             count[2]++;
28             water[2] = id[i];
29         }
30         else if (id[i] == water[0])    //如果count为0,重新赋值
31         {
32             count[0]++;
33         }
34         else if (id[i] == water[1])
35         {
36             count[1]++;
37         }
38         else if (id[i] == water[2])
39         {
40             count[2]++;
41         }
42         else //如果与三个嫌疑人的ID都不同,则三个计数数组的值都减1,直到count为0
43         {
44             count[0]--;
45             count[1]--;
46             count[2]--;
47         }
48     }
49 }
50 
51 int main(int argc, char* argv[])
52 {
53     int i;
54     int ID[MAX];                //发帖记录表
55     int in[MAX + 1];                //从文件中读出的数组
56     int num, King[3];            //发帖数目、水桶
57     
58     //读取文件中的id号
59     ifstream infile("id_form.txt", ios::in);
60     if (infile.is_open() == false)
61     {
62         cerr << "open error!" << endl;
63         exit(1);
64     }
65     infile >> in[0];//读取帖子总数
66     num = in[0];
67     cout << "帖子的总数为:" << in[0] << endl;
68 
69     cout << "发帖的id号分别为:" << endl;
70     for (i = 0; i < num; i++)
71     {
72         infile >> in[i + 1];
73         ID[i] = in[i + 1];
74         cout << ID[i] << " ";
75     }
76     cout << endl;
77 
78     Find(ID, num, King);
79     cout << endl << "找到小水王!!!" << endl;
80     cout << "id为:";
81     for (i = 0; i<3; i++)
82     {
83         cout << King[i] << " ";
84     }
85     cout << endl;
86     infile.close();
87     return 0;
88 }
三、实现截图
四、个人总结
      看到了老师给我之前写的代码的评论才意识到最好在主函数中使用int main()而不是void main()。其实以前真的没有注意这个,编写主函数的时候想起来哪个就写哪个了。这一点以后我会注意的。通过水王这两次实验,加上之前做过的数组最大值,包括二柱子的程序题,越来越让我懂得程序中的迭代思想,很多程序都是思想互通的。就好比这次实验,如果没有水王1,我可能不会那么快的想到这次的算法思想。因此以后在考虑问题的时候一定要把问题拆分来看,或者把问题转换去看。一题多解,多题一解。
posted on 2016-05-27 16:25  波棱盖儿卡秃噜皮  阅读(152)  评论(0编辑  收藏  举报