课堂练习——寻找水霸

一,题目:随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?

二,思路:(1)将所有的ID号从小到大进行排序,然后分别统计各个ID号的个数,找出其中出现次数超过1/4的ID号,即为所求,但时间复杂度过于复杂。

(2)在思路一排序的基础上,三个水霸的ID号分别在1/4,1/2,3/4处。

(3)在上一堂课寻找水王的基础上,寻找水霸即为消去连续的4个不同的ID。

三,程序:

#include <iostream.h>
#include <conio.h>
void intID(int length,int Arr[])

{

cout<<"输入发帖人的ID:"<<endl;

for(int i=0;i<length;i++)

{

cin>>Arr[i];

}

}
int main()
{
int length;//发帖人ID的个数
int t[3]={0,0,0};
int ID[3]={-1,-1,-1};
cout<<"请输入帖子数量:";
cin>>length;
int * shuiba=new int [length];
int jixu;
intID(length,shuiba);
for(int i=0;i<length;i++)
{

if(t[0]==0 && shuiba[i]!=ID[1] && shuiba[i]!=ID[2])
{
t[0]=1;
ID[0]=shuiba[i];
}
else if(t[1]==0 && shuiba[i]!=ID[0] && shuiba[i]!=ID[2])
{
t[1]=1;
ID[1]=shuiba[i];
}
else if(t[2]==0 && shuiba[i]!=ID[0] && shuiba[i]!=ID[1])
{
t[2]=1;
ID[2]=shuiba[i];
}

else if(shuiba[i]!=ID[0] && shuiba[i]!=ID[1] && shuiba[i]!=ID[2])
{
t[0]--;
t[1]--;
t[2]--;
}
else if(shuiba[i]==ID[0])
{
t[0]++;
}
else if(shuiba[i]==ID[1])
{
t[1]++;
}
else if(shuiba[i]==ID[2])
{
t[2]++;
}

}
cout<<"水霸的ID为:"<<ID[0]<<" "<<ID[1]<<" "<<ID[2]<<endl;
cout<<endl;
cout<<"要继续测试吗?(0,退出 1,继续)"<<endl;
cin>>jixu;
if(jixu==1)
{
cout<<endl;
main();
}
else
{
return 0;
}
getch();
return 0;
}

四,运行结果:

五,总结:

这道题目相对比较简单,有了前面课堂练习的基础能够解决类似问题。但题目并不是单纯地要求实现,而是要求我们运用算法来进行优化,减少程序运行时间,这就要求我们花费时间考虑更好的解决方法。找到对的解决方法才是解决这类问题的关键。

原文地址:https://www.cnblogs.com/xiaojin123/p/4463755.html