课堂练习------寻找水王2
一、题目
•三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
•随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
二、设计思想
原来问题的求解,是超过半数的水王,现在变成超出1/4,那么剩下的就不会超过1/4,由此可以分析,如果每次比较,去除其中不相同的三个数据,那么,跟去除找到其中超过1/2的ID数的解法是一样的,所以,我们可以设置一个数组来存储三个不相同的ID,然后从water列表中找出与这三个匹配的ID,如果匹配的话,那么计数标志signal[]+1,如果不匹配,所有ID的标志位-1,那么到最后剩下的肯定是数量最多的三个ID
三、代码截图
1 #include<iostream.h> 2 void Data(int length,int a[]) 3 { 4 cout<<"请输入符合条件的ID列表(其中三个ID的数量分别超过1/4,其他的ID少于1/4):"<<endl; 5 for(int i=0;i<length;i++) 6 { 7 cin>>a[i]; 8 } 9 } 10 11 int main() 12 { 13 int length; 14 int signal[3]={0,0,0}; 15 int ID[3]={-1,-1,-1}; //设置信号量 16 cout<<"请输入帖子数量:"; 17 cin>>length; 18 int * water=new int [length]; 19 Data(length,water); 20 for(int i=0;i<length;i++) 21 { 22 /*先将ID列表初始化,找出三个不同的ID*/ 23 if(signal[0]==0 && water[i]!=ID[1] && water[i]!=ID[2]) 24 { 25 signal[0]=1; 26 ID[0]=water[i]; 27 } 28 else if(signal[1]==0 && water[i]!=ID[0] && water[i]!=ID[2]) 29 { 30 signal[1]=1; 31 ID[1]=water[i]; 32 } 33 else if(signal[2]==0 && water[i]!=ID[0] && water[i]!=ID[1]) 34 { 35 signal[2]=1; 36 ID[2]=water[i]; 37 } 38 /*开始进行查找,不同标志single+1,相同标志-1*/ 39 else if(water[i]!=ID[0] && water[i]!=ID[1] && water[i]!=ID[2]) 40 { 41 signal[0]--; 42 signal[1]--; 43 signal[2]--; 44 } 45 else if(water[i]==ID[0]) 46 { 47 signal[0]++; 48 } 49 else if(water[i]==ID[1]) 50 { 51 signal[1]++; 52 } 53 else if(water[i]==ID[2]) 54 { 55 signal[2]++; 56 } 57 58 } 59 cout<<"水王为:"<<ID[0]<<ID[1]<<ID[2]<<endl; 60 return 0; 61 }