一、题目
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗
二、设计思路
原来问题的求解,是超过半数的水王,现在变成超出1/4,那么剩下的就不会超过1/4,由此可以分析,如果每次比较,去除其中不相同的三个数据,那么,跟去除找到其中超过1/2的ID数的解法是一样的,所以,我们可以设置一个数组来存储三个不相同的ID,然后从waterking列表中找出与这三个匹配的ID,如果匹配的话,那么计数标志single[]+1,如果不匹配,所有ID的标志位-1,那么到最后剩下的肯定是数量最多的三个ID
三、源代码(在原来基础上进行改进)
1 // waterking.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include"iostream" 6 using namespace std; 7 8 void Data(int length,int A[]) 9 { 10 cout<<"请输入符合条件的ID列表(其中三个ID的数量分别超过1/4,其他的ID少于1/4):"<<endl; 11 for(int i=0;i<length;i++) 12 { 13 cin>>A[i]; 14 } 15 } 16 17 int main() 18 { 19 int length; 20 int single[3]={0,0,0}; 21 int ID[3]={-1,-1,-1}; //设置信号量 22 cout<<"请输入帖子数量:"; 23 cin>>length; 24 int * waterking=new int [length]; 25 Data(length,waterking); 26 for(int i=0;i<length;i++) 27 { 28 /*先将ID列表初始化,找出三个不同的ID*/ 29 if(single[0]==0 && waterking[i]!=ID[1] && waterking[i]!=ID[2]) 30 { 31 single[0]=1; 32 ID[0]=waterking[i]; 33 } 34 else if(single[1]==0 && waterking[i]!=ID[0] && waterking[i]!=ID[2]) 35 { 36 single[1]=1; 37 ID[1]=waterking[i]; 38 } 39 else if(single[2]==0 && waterking[i]!=ID[0] && waterking[i]!=ID[1]) 40 { 41 single[2]=1; 42 ID[2]=waterking[i]; 43 } 44 /*开始进行查找,不同标志single+1,相同标志-1*/ 45 else if(waterking[i]!=ID[0] && waterking[i]!=ID[1] && waterking[i]!=ID[2]) 46 { 47 single[0]--; 48 single[1]--; 49 single[2]--; 50 } 51 else if(waterking[i]==ID[0]) 52 { 53 single[0]++; 54 } 55 else if(waterking[i]==ID[1]) 56 { 57 single[1]++; 58 } 59 else if(waterking[i]==ID[2]) 60 { 61 single[2]++; 62 } 63 64 } 65 cout<<"水王为:"<<ID[0]<<ID[1]<<ID[2]<<endl; 66 return 0; 67 }
四、实验结果
五、实验结果分析
许多问题都是有共同点的,如果我们能够找到几个问题的共同点,那么,如果可以解决一个问题,就可以解决多个问题,就不用再去重新审视问题分析问题了,只需要在原来的基础上进行拓展就可以了,就像这次的找水王,找一个和找三个的其实没有什么区别,一个人发帖数超过一半,3个人发帖数超过1/4,那么3个人加起来也超过了一半,如果将三个人看成一个整体,那么跟一个人的时候就成了一样的问题。
所以,在解决问题时,我们不妨先做分析,要解决的问题跟某个问题相似或者原理相同,而这个问题是怎样解决的,要解决的问题应该进行怎样的转化,就可以跟这个问题一样了。如果我们能够正确的分析问题,最后的结果肯定事半功倍,节省大量的时间
时间: 2024-10-08 10:21:24