一、题目
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的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); }
四、截图
五、总结
本次实验收获颇丰,思想和上一水王一样,消去的方法还是很好的。