一、题目
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗
二、设计思路
参考原来问题的解法,如果每次删除4个不同的ID(不管是否超过总数1/4的ID),那么,剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4。可以通过不断重复这个过程,把ID总数降低,从而得到问题的答案。具体方法:用shuiwang[3]记录三个候选ID,用key[3]记录它们的累积次数,然后遍历整个ID列表,每处理一个ID,若与shuiwang[i]中的某一个相同,则key[i]++,若与三个都不同,则说明找到了四个互不相同的ID,将三个key[i]--,也就相当于“删除了四个不同ID”,若某一个key[i]==0,则更新之。
三、
#include<iostream.h>
#include<String.h>
void find(int ID[],int N)
{
int i;
int key[3];
int shuiwang[3];
key[0]=key[1]=key[2]=0;
shuiwang[0]=shuiwang[1]=shuiwang[2]=0;
for(i = 0; i < N; i++)
{
if(ID[i]==shuiwang[0])
{
key[0]++;
}
else if(ID[i]==shuiwang[1])
{
key[1]++;
}
else if(ID[i]==shuiwang[2])
{
key[2]++;
}
else if(key[0]==0)
{
key[0]=1;
shuiwang[0]=ID[i];
}
else if(key[1]==0)
{
key[1]=1;
shuiwang[1]=ID[i];
}
else if(key[2]==0)
{
key[2]=1;
shuiwang[2]=ID[i];
}
else
{
key[0]--;
key[1]--;
key[2]--;
}
}
for(i=0;i<3;i++)
{
cout<<"水王"<<i+1<<"的ID是"<<shuiwang[i]<<endl;
}
}
int main()
{
int ID[]={1,2,1,1,2,3,2,3,3,4,4};
find(ID,11);
}
四、截图

五、总结
本次实验收获颇丰,思想和上一水王一样,消去的方法还是很好的。