这道题的关键在于标签出现次数的平均值求的比较麻烦
由于只出现1次的标签平均值都是1没啥意义,我们直接看出现次数不是1的标签平均值即可
即我们比较ave=(num-s.size())/num即可(num是该用户的总点赞数,s.size()是去重后的数
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
const int N=1e2+5;
struct Peo
{
string name;
int k;
int te;
double ave;
}p[N];
int n,k;
set<int> s;
bool cmp(Peo a,Peo b)
{
if (a.te==b.te) return a.ave<b.ave;
return a.te>b.te;
}
int main()
{
cin.tie(0);
cin>>n;
for (int i=0;i<n;i++)
{
string name;
int k,a;
s.clear();
cin>>name>>k;
for (int j=0;j<k;j++)
{
cin>>a;
s.insert(a);
}
p[i].name=name;
p[i].k=k;
p[i].te=s.size();
p[i].ave=1.0*(k-s.size())/(k*1.0);
}
sort(p,p+n,cmp);
if (n<3) {
for (int i=0;i<n;i++)
{
if (i!=0) cout<<" ";
cout<<p[i].name;
}
for (int i=0;i<3-n;i++) cout<<" -";
}
else
for (int i=0;i<3;i++)
{
if (i!=0) cout<<" ";
cout<<p[i].name;
}
}