标题:救助。acm题,内存过大
只看楼主
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1026
专家分:177
注 册:2007-5-10
得分:0 

我们把输入的数看作一个集合(多重集),如果这个集合中的元素都是相等的,那么显然任意一个元素都是The Most Frequent Number(以下简称TMFN),否则必定存在一对不等的元素,任意取出一对不等的元素将其丢弃,重复上述操作直到这个集合中的元素都是相等的。

在这个前提的保证下算法是正确的--it is assumed that there is a number X which has more than L / 2 instances in A.
因为每一次丢弃操作都丢弃了两个不等的数,所以至多丢弃了一个TMFN。
反证,假设最后剩下的元素不是TMFN,那么必定进行了L/2次以上的丢弃操作,也就是丢弃了大于L个数,而一共只有L个数,所以矛盾。所以最后剩下的是TMFN。

2007-08-11 00:35
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
得分:0 

好办法 。。。。。。。我没利用到那个条件。。。。楼上强

2007-08-11 00:51
wswwang
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-1-5
得分:0 
谢谢
2007-08-12 20:29
wswwang
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-1-5
得分:0 
leeco 的方法应该怎么写,请指教,谢谢,小弟我不会
http://acm.zju.edu.cn/show_problem.php?pid=2132
2007-08-14 15:22
noah_shi
Rank: 1
等 级:新手上路
帖 子:39
专家分:0
注 册:2007-8-14
得分:0 

小弟习惯C++,leeco的算法实现应该就是这样的。
[CODE]
#include <iostream.h>

const int nMaxCount = 250000;
int main()
{
int nNum1 = 0;
int nNum2 = 0;
int nCount = 0;
int i = nMaxCount;

while(i--)
{
if(nCount == 0)
{
cin>>nNum1;
nCount++;
}
else if(nCount >= 1)
{
cin>>nNum2;
}

if(nNum1 && nNum2)
{
if(nNum1 == nNum2)
{
nCount++;
nNum2 = 0;
}
else
{
nCount--;
if(nCount == 0)
{
nNum1 = 0;
}
nNum2 = 0;
}
}
}
cout<<nNum1<<endl;

return 0;
}
[/CODE]


2007-08-14 20:31
wswwang
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-1-5
得分:0 

谢谢

2007-08-14 22:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-161594-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.132497 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved