zoukankan      html  css  js  c++  java
  • 编程之美 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/

  • 相关阅读:
    mysql高可用架构的构想
    shell进阶——expect免交互工具的使用
    Mysql性能优化之参数配置(转)
    mysql主从同步问题梳理
    使用mysql-proxy实现mysql的读写分离
    Mysql数据库的主从与主主
    Mariadb远程登陆配置及相关问题排查
    redis集群搭建及常用操作
    weblogic的linux静默搭建
    Python traceback 模块,追踪错误
  • 原文地址:https://www.cnblogs.com/Dzhouqi/p/3360015.html
Copyright © 2011-2022 走看看