”水王“问题

原创 2013年12月04日 22:10:40

来自编程之美

方法一:sort,第n/2个数必定是那个数;

fast select,选择第n/2个数;


方法二:

int Find(int *id,int N)
{
    int candidate;
    int nTimes,i;
    for(i=nTimes=0;i<N;i++)
    {
        if(nTimes==0)
        {
             candidate=id[i];
             nTimes=1;
        }
        else
        {
             if(candidate==id[i])
                 nTimes++;
             else
                 nTimes--;
        }
    }
    return candidate;
}

扩展1:找出正好出现一半的那个数

int Find(int* a, int N)  
{  
    int candidate1,candidate2;  
    int nTimes1, nTimes2, i;  
          
    for(i = nTimes1 = nTimes2 =0; i < N; i++)  
    {  
        if(nTimes1 == 0)  
        {  
            candidate1 = a[i], nTimes1 = 1;  
        }  
        else if(nTimes2 == 0 && candidate1 != a[i])  
        //注意:这里的判断条件加上第二个变量是否等于第一个变量的判断  
        {  
              
            candidate2 = a[i], nTimes2 = 1;  
        }  
        else  
        {  
            if(candidate1 == a[i])  
                nTimes1++;  
            else if(candidate2 == a[i])  
                nTimes2++;  
            else  
            {  
                nTimes1--;  
                nTimes2--;  
            }  
        }  
    }  
    return nTimes1>nTimes2?candidate1:candidate2;  
}  


扩展2:如果论坛发帖ID列表中,有三个发帖很多的ID,他们的发帖数目都超过了帖子总数N的1/4,你能快速找到它们吗?

void find3(int a[],int ret[],int n)
{
    int cnt[3] = {0};
    int i,j,k;

    ret[0] = ret[1] = ret[2] = INT_MIN;
    for(i = 0; i < n;i++)
    {
        for(j = 0; j < 3;j++)
            if(ret[j] == a[i])
            {
                cnt[j]++;
                break;
            }
        if(j == 3)
        {
            for(k = 0; k < 3;k++)
                if(cnt[k] == 0)
                {
                    cnt[k] = 1;
                    ret[k] = a[i];
                    break;
                }
            if(k == 3)
                cnt[0]--,cnt[1]--,cnt[2]--;
        }
    }
}



NOJ1052水王争霸——理解

水王争霸 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte 总提交:145            测试通过:57 描述     ...
  • tcherry
  • tcherry
  • 2014年06月14日 15:37
  • 1007

《编程之美》读书笔记: 寻找发帖水王的扩展问题 2.3

随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超  过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?  int a[] ...
  • cvTingWei
  • cvTingWei
  • 2011年04月06日 15:03
  • 3327

【多级排序】水王争霸

输入的第一行是一个1到1000的整数N,表示总共有N位水王参加了争霸赛。 以下依次给出每位水王的描述,一位水王的描述占据两行,第一行为一个仅由字母和数字组成的长度不超过20的字符串,代表这个水王的ID...
  • IronCarrot
  • IronCarrot
  • 2016年12月06日 00:26
  • 490

南邮 OJ 1052 水王争霸

水王争霸 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 171            测试通过 : ...
  • changshu1
  • changshu1
  • 2015年08月04日 09:50
  • 368

编程之美:水王问题及扩展

题目描述:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水...
  • gao1440156051
  • gao1440156051
  • 2016年06月08日 12:07
  • 655

noj 1052 水王争霸

水王争霸 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte 总提交 : 182 测试通过 : 87...
  • CriminalCode
  • CriminalCode
  • 2016年02月17日 16:48
  • 517

[Vijos]P1257 水王争霸

题目描述众所周知,IOIForum有很多水王,他们的发贴数是如此之多,以至于必须要用高精度数才能保存。为了迎接国庆,IOIForum决定举行一次水王争霸赛,比赛的规则是将这些水王截止到2003年9月3...
  • Binary10
  • Binary10
  • 2015年08月12日 22:10
  • 1088

编程之美---超级水王扩展题目

/** * 一个数组中有N个数字出现的次数都超过数组总长度L的1/(N+1),查找这些ID * */ #include #include #include #include #inclu...
  • leewon1988
  • leewon1988
  • 2013年08月25日 15:11
  • 587

编程之美---发帖“水王”扩展问题

扩展问题一:随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?问题求解:上...
  • will130
  • will130
  • 2015年05月26日 14:54
  • 653

水王争霸

每灌一次水,服务器就用一个容量为无限的虚拟容器收集这1L水。
  • sundujing
  • sundujing
  • 2015年07月18日 10:29
  • 572
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:”水王“问题
举报原因:
原因补充:

(最多只允许输入30个字)