寻找水王2

如题:

随着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; 
}
    

总结:这不相同抵消的办法太妙了,极大地减少了时间复杂度。我自己做的时候没想出来,还是在同学的同学的提醒和上网查找资料的时候才领悟到的。以后的学习还是要多思考才行。

遇到的问题:总的来说,这次实验没有太大的问题。

原文地址:https://www.cnblogs.com/hph1313/p/5533872.html