解题思路:由于水王的发帖数目超过一半,当每次删除两个不同ID的帖子时,水王占得帖子数目仍然大于剩下帖子的一半,重复整个过程,将ID列表中的ID总数降低,转化为更小的问题,从而得到最后水王的ID。
#include <iostream>
#include <fstream>
using namespace std;
const int MAX=1000;
int a[MAX];
int main()
{
int candidate=nTimes=0,id;
ifstream Input("data1.txt");
if(!Input)
{
cerr<<"open file error"<<endl;
exit(1);
}
while(!Input.eof())
{
Input>>id;
if(nTimes==0)
{
candidate=id;
nTimes++;
}
else
{
if(candidate==id)
nTimes++;
else
nTimes--;
}
}
cout<<candidate<<endl;
}
问题扩展:如果没有超级水王了,可是有三个ID在列表中出现的次数都超过了1/4,怎么找出这三个ID?
解题思路:现在问题是有三个水王,每次删除4个ID不同的帖子,不影响三个水王在剩余ID中出现仍然超过1/4,故可以每次删除4个不同的ID,直到剩下3个ID为止。
<span style="font-size:18px;">#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
int main(int argc,char *argv[]){
int candidate[3]={0,0,0},nTimes[3]={0,0,0},id;
ifstream Infile("data.txt");
if(!Infile)
{
cerr<<"Open file error!"<<endl;
exit(1);
}
while(!Infile.eof())
{
Infile>>id;
if(nTimes[0]==0)
{
candidate[0]=id;
nTimes[0]++;
}
else if(nTimes[1]==0)
{
candidate[1]=id;
nTimes[1]++;
}
else if(nTimes[2]==0)
{
candidate[2]=id;
nTimes[2]++;
}
else
{
if(candidate[0]==id)
nTimes[0]++;
else if(candidate[1]==id)
nTimes[1]++;
else if(candidate[2]==id)
nTimes[2]++;
else
{
nTimes[0]--;
nTimes[1]--;
nTimes[2]--;
}
}
}
cout<<candidate[0]<<" "<<candidate[1]<<" "<<candidate[2]<<endl;
return 0;
}</span>
参考文章:http://blog.csdn.net/super_chris/article/details/7187376