找水王

问题:

•三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
•如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
解题思想
条件为  在一个数组str中,存在着水王、及其他用户。其中水王超过了50%。
问题为  找到水王。
问题简化为:在str数组中,存在着0-9数字,其中一个数字的个数超过了50%,找到这个数字。
设计思想:1、先构建一个有若干个数字的数组,其中水王数字超过50%。2、将相邻数字匹配,相同则留下,不同则删去。3、遍历一遍即可找到水王数字。
 
 1 #include <iostream>
 2 #include <ctime>
 3 #include <string>
 4 using namespace std;
 5 void main()
 6 {
 7     //构造数组str
 8     srand((unsigned)time(0));
 9     string str = "";
10     int Numstr = 1000;   //定义数组长度
11     int num=0;    //记录水王数字个数
12     int Shuiwang=rand()%10;  //随机定义水王数字
13     while (Numstr!=0)
14     {
15         if(rand()%10 <= 5) //  加水王数字
16         {
17             str+=Shuiwang+48;
18             num++;
19         }
20         else             //否则 加水王或者其他数字    
21         {
22             str+=rand()%10+48;
23         }
24         Numstr--;
25     }
26     cout<<"含水王的数组:"<<str<<endl;
27     cout<<"水王数字的个数:"<<num<<endl;
28     //相邻数字 匹配  相同则复制到str1中  
29     string str1 = "";
30     for(int i=0;i<str.length();i=i+2)
31     {
32         if(str[i]==str[i+1])
33         {
34             str1+=str[i];
35         }
36     }
37     cout<<str1<<endl;     //此时str1中  绝大部分都是水王数字
38     //其中任取若干 相同则是水王
39     //此时取3个
40     while(1)
41     {
42         int a=rand()%str1.length();
43         int b=rand()%str1.length();
44         int c=rand()%str1.length();
45         if(str1[a]==str1[b]&&str1[a]==str1[c])
46         {
47             cout<<"水王是:"<<str1[a]<<endl;
48             break;
49         }
50     }
51 }

结果截图:

 

 

另外,因为水王个数已经超过了1/2,从中随机找三个,如果三个一样即为水王。原因有下:

1、用户的个数会是个大数字,且每个用户的发帖个数与1/2的水王发帖个数相差甚多。

2、论坛的发帖个数会是个大数字。

3、假设有11个用户,水王占最少1/2,其他发帖平均为最多  1/20。三个都是水王的概率为1/2 * 1/2 * 1/2 为1/8。其他平均概率为 1/20 * 1/20  * 1/20 为1/8000。

由上即可断定水王。

代码如下:

 1 //条件为  在一个数组str中,存在着水王、及其他用户。其中水王超过了50%。
 2 //问题为  找到水王。
 3 //问题简化为:在str数组中,存在着0-9数字,其中一个数字的个数超过了50%,找到这个数字。
 4 //设计思想:1、先构建一个有若干个数字的数组,其中水王数字超过50%。2、将相邻数字匹配,相同则留下,不同则删去。3、遍历一遍即可找到水王数字。
 5 #include <iostream>
 6 #include <ctime>
 7 #include <string>
 8 using namespace std;
 9 string STR()
10 {
11     //构造数组str
12     srand((unsigned)time(0));
13     int f=1;
14     while(f)
15     {
16         string str = "";
17         int Numstr = 1000;   //定义数组长度
18         int num=0;    //记录水王数字个数
19         int Shuiwang=rand()%10;  //随机定义水王数字
20         while (Numstr!=0)
21         {
22             if(rand()%2 == 1) //  加水王数字
23             {
24                 str+=Shuiwang+48;
25                 num++;
26             }
27             else             //否则 加水王或者其他数字    
28             {
29                 str+=rand()%10+48;
30             }
31             Numstr--;
32         }
33         if(num>500)
34         {
35             cout<<"含水王的数组:"<<str<<endl;
36             cout<<"水王数字的个数:"<<num<<endl;
37             return str;
38         }
39     }
40 }
41 void main()
42 {
43     string str=STR();
44                 //其中任取若干 相同则是水王
45     //此时取3个
46     while(1)
47     {
48         int a=rand()%str1.length();
49         int b=rand()%str1.length();
50         int c=rand()%str1.length();
51         if(str1[a]==str1[b]&&str1[a]==str1[c])
52         {
53             cout<<"水王是:"<<str1[a]<<endl;
54             break;
55         }
56     }*/
57 
58     while(1)
59     {
60         int a=rand()%str.length();
61         int b=rand()%str.length();
62         int c=rand()%str.length();
63         if(str[a]==str[b]&&str[a]==str[c])
64         {
65             cout<<"水王是:"<<str[a]<<"   "<<str[b]<<" "<<str[c]<<endl;
66             break;
67         }
68     }
69 }

结果如图:

posted @ 2016-05-18 17:27  _小青年  阅读(298)  评论(0编辑  收藏  举报