如题:
随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?
通过上网和查找资料,我找到了一种算法思想,复杂度最小,即:
如果每次删除四个不同的ID(不管是否包含发帖数目超过总数1/4的ID),那么,在剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4。可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案。
通过理解和加以修改,我的代码如下:
#include<iostream> using namespace std; void main() { int array1[11]={1,1,1,2,2,2,3,3,3,4,4};//假设其为id数组 int i; int cand=0,cand1=0,cand2=0; int n=0,n1=0,n2=0; for(i=0;i<11;i++) //寻找水王 { if(array1[i]==cand) //比较1是否相同 { n++; } else if(array1[i]==cand1)//同一类似 { n1++; } else if(array1[i]==cand2)//同一类似 { n2++; } else if(n==0) { n=1; cand=array1[i]; } else if(n1==0) { n1=1; cand1=array1[i]; } else if(n2==0) { n2=1; cand2=array1[i]; } else { //删除不同的数组 n--; n1--; n2--; } } cout<<"水王是:"<<cand<<" "<<cand1<<" "<<cand2<<endl; }
总结:这不相同抵消的办法太妙了,极大地减少了时间复杂度。我自己做的时候没想出来,还是在同学的同学的提醒和上网查找资料的时候才领悟到的。以后的学习还是要多思考才行。
遇到的问题:总的来说,这次实验没有太大的问题。