当前位置: 代码迷 >> C语言 >> 救助。acm题,内存过大
  详细解决方案

救助。acm题,内存过大

热度:460   发布时间:2007-08-11 00:35:17.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。


----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
谢谢

----------------解决方案--------------------------------------------------------
leeco 的方法应该怎么写,请指教,谢谢,小弟我不会
http://acm.zju.edu.cn/show_problem.php?pid=2132
----------------解决方案--------------------------------------------------------

小弟习惯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]


----------------解决方案--------------------------------------------------------

谢谢


----------------解决方案--------------------------------------------------------
  相关解决方案