这道题直接用map就行,我用了三个map,mp是用来判断对于一个人str来说,这个标签是否已经出现过的,cnt记录str的点击过的标签种类数,cishu就是str的一共的点赞次数,最后将他们放入结构体数组中,,按照题意排序再输出就OK了,这道题难度还是相当低的。
#include<iostream>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
map<string,set<int> >mp;
map<string,int>cnt;
map<string,int>cishu;
struct node{
string str;
int cnt;
double ave;
}ret[105];
bool cmp(node a,node b)
{
if(a.cnt>b.cnt)return true;
if(a.cnt==b.cnt&&a.ave<b.ave)return true;
return false;
}
int main()
{
int n;
cin>>n;
char str[1000];
for(int i=0;i<n;i++)
{
string str;
cin>>str;
cnt[str]=0; //标签种类数
cishu[str]=0; //一共点赞次数
int k,t;
cin>>k;
while(k--)
{
scanf("%d",&t);
cishu[str]++;
int siz=mp[str].size();
mp[str].insert(t);
if(siz!=mp[str].size())
cnt[str]++;
}
}
map<string,int>::iterator it;
int k=0;
for(it=cnt.begin();it!=cnt.end();it++)
{
ret[k].str=(*it).first;
ret[k].cnt=(*it).second;
ret[k].ave=cishu[ret[k].str]*1.0/ret[k].cnt;
k++;
}
sort(ret,ret+n,cmp);
// for(int i=0;i<n;i++)
// {
// cout<<ret[i].str<<' '<<ret[i].cnt<<' '<<ret[i].ave<<endl;
// }
for(int i=0;i<(n<=3?n:3);i++)
{
cout<<ret[i].str;
if(i!=(n<=3?n:3)-1)
cout<<' ';
}
while(3-n>0)
{
n++;
cout<<" -";
}
}