课堂练习之《三个水王》
实验题目
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
实验思路
跟上一次一样,只不过是计数器由一个变为了三个,定义数组表示它们,由于据统计他们的发帖数量超过了1/4,可将每个水桶ID都与其它水军ID进行抵消最后剩下的就是三个水王,将前三个不同水军ID置为水桶ID,开始抵消计数,“水王”中抵消后数量剩余为0的即被淘汰,用一个最新的水军ID继续进行抵消,最后剩下的即为水桶ID。
代码实现
1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 //首先假定用户的ID列表为一个数组 7 int Id[30]={1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,1,2,3}; 8 int ShuiW=Id[0]; //默认水王为第一个Id 9 int length=30; 10 int Idnum[3]={0,0,0}; 11 int ID[3]={0,0,0}; 12 cout <<"水王ID列表为"<<endl; 13 for(int i=0;i<length;i++) //输出ID列表 14 { 15 cout<<Id[i]<<" "; 16 } 17 cout<<endl; 18 for(int i=0;i<length;i++) 19 { 20 if(Idnum[0]==0 && Id[i]!=ID[1] && Id[i]!=ID[2]) //第一个水王 21 { 22 Idnum[0]=1; 23 ID[0]=Id[i]; 24 } 25 else if(Idnum[1]==0 && Id[i]!=ID[0] && Id[i]!=ID[2]) //第二个水王 26 { 27 Idnum[1]=1; 28 ID[1]=Id[i]; 29 } 30 else if(Idnum[2]==0 && Id[i]!=ID[0] && Id[i]!=ID[1]) 31 { 32 Idnum[2]=1; 33 ID[2]=Id[i]; 34 } 35 else if(Id[i]!=ID[0] && Id[i]!=ID[1] && Id[i]!=ID[2]) //相互抵消,最后抵消为零淘汰,更换新的ID作为水王 36 { 37 Idnum[0]--; 38 Idnum[1]--; 39 Idnum[2]--; 40 } 41 else if(Id[i]==ID[0]) 42 { 43 Idnum[0]++; 44 } 45 else if(Id[i]==ID[1]) 46 { 47 Idnum[1]++; 48 } 49 else if(Id[i]==ID[2]) 50 { 51 Idnum[2]++; 52 } 53 } 54 cout<<"第一个水王的ID是:"<<ID[0]<<endl; 55 cout<<"第二个水王的ID是:"<<ID[1]<<endl; 56 cout<<"第三个水王的ID是:"<<ID[2]<<endl; 57 return 0; 58 }
运行截图