编程之美 2.3寻找发帖‘水王’ 扩展问题

 扩展问题

扩展问题中,有3个发帖水王超过帖子总数N的1/4,请找出这3个水王。

 

个人解法

 

1设置备选组3个 candidate[3]

2设置计数组3个 nTimes[3]

3每次若没有出现  candidate[j],则nTimes[j]-=1/3.0;

为什么呢?

假设某贴王发帖数超过总数的1/K倍,设若每次没有出现他发的贴则减去1/T;一共有N个帖子。

则:X>=(N-x)/T;即出现贴王一次,要+1,没出现一次-1/T,最后的权值(nTimes)要大于等于0

则:x>=N/(T+1);即K=T+1;书中K=2,则T=1,扩展问题中K=4,则T=3.0;

 

附上C++代码如下:

// 2.3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;
void Find(int ID[],int N);

int ID[20]={1,1,1,3,2,1,11,2,3,3,4,2,3,6,2,2,3,1,2,1};//代表发帖人的ID
//int ID[20]={1,1,1,1,1,1,3,4,5,6,7,8,9,10,11,12,13,14,15};

int _tmain(int argc, _TCHAR* argv[])
{
    Find(ID,20);
    return 0;
}

void Find(int ID[],int N)//有3个人发帖超过总数的0.25N
{
    int candidate[3];
    int i,j;

    double nTimes[3]={0,0,0};


    bool label=true;


    for(i=0;i<N;i++)
    {label=true;
        for(j=0;j<3;j++)
        {
            if(nTimes[j]!=0 & candidate[j]==ID[i])
            {
                nTimes[j]+=4/3.0;//因为后面要统一减 1/3,所以这里要加4/3
                label=false;//如果下个数字与candidate重复则,不进行下面的循环。
                break;
                
            }
        }

        if(label)
        {
        
                for(j=0;j<3;j++)
                {
                        if(nTimes[j]<=0)
                        {
                            candidate[j]=ID[i];
                            nTimes[j]=4/3.0;//因为后面要统一减 1/3,所以这里要加4/3
                
                            break;
                

                        }
                }
        
        }
        
            for( j=0;j<3;j++)
            {

                nTimes[j]-=1/3.0;
            }
        
            

        

        }
    
        

            for(j=0;j<3;j++)
            cout<<candidate[j]<<endl;
        

}

 

 

 

注:问题是有前提的,有3个发帖水王超过帖子总数N的1/4。

 


本人水平有限,怀着分享学习的态度发表此文,欢迎大家批评,交流。感谢您的阅读。
欢迎转载本文,转载时请附上本文地址:http://www.cnblogs.com/Dzhouqi/p/3360015.html
另外:欢迎访问我的博客 http://www.cnblogs.com/Dzhouqi/

 

 

posted @ 2013-10-09 20:07  joey周琦  阅读(750)  评论(0编辑  收藏  举报