水王续

一、题目

  随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的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);
}

四、截图

五、总结

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

原文地址:https://www.cnblogs.com/wang321/p/4583531.html