寻找水王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,我可能不会那么快的想到这次的算法思想。因此以后在考虑问题的时候一定要把问题拆分来看,或者把问题转换去看。一题多解,多题一解。
Keyboard not found...press F1 to continue:)