思路与书中2.3节寻找发帖水王的思路类似。
每次删除四个不同的ID,那么在剩下的ID中,3个发帖很多的ID,发帖数目仍然超过了剩余帖子总数的1/4。可以不断重复这个过程,直至ID的不同个数等于3。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
unsigned NumTango = 3;
vector<int> Find(const vector<int> &ID)
{
vector<int> candidate(NumTango);
vector<int> nTimes(NumTango, 0);
int n = ID.size();
int i = 0;
for (; i < n; ++i)
{
bool exist = false;
int index = -1;
for (int j = 0; (j < NumTango) && (!exist); ++j) {
if (nTimes[j] == 0)
{
index = j;
}
else if (candidate[j] == ID[i])
{
exist = true;
nTimes[j] ++;
}
}
if (exist)
{
continue;
}
else if (index != -1)
{
nTimes[index] = 1;
candidate[index] = ID[i];
}
else
{
for (int j = 0; j < NumTango; ++j) {
nTimes[j]--;
}
}
}
return candidate;
}
void Display(const vector<int> &ID)
{
for (auto id : ID)
{
cout << id << ' ';
}
cout << endl;
}
int main()
{
vector<int> ID = { 4, 6, 7, 8, 4, 4, 6, 6, 7, 7, 8 };
vector<int> tango = Find(ID);
cout << "ID: ";
Display(ID);
cout << "Tango: ";
Display(tango);
system("pause");
return 0;
}