题目链接:PTA | 程序设计类实验辅助教学平台
分析:这道题目算是天梯L2题目中比较简单的一个了,我们只需要设置一个结构体,里面设置有人的名字和每个人点赞的不同标签的数量以及每个人点赞的总数,每个人的名字以及每个人点赞的总数都是通过直接读入的。而记录每个人点赞的不同标签的数量我们可以通过set来实现,每次把点赞的标签放入set中,最后set里面数的个数就是点赞的不同标签的数量,不要忘记对于每个人都需要把set清空,最后只需要排序就行了,排序规则就是优先输出不同标签数量较多的那一个,如果不同标签数量相同就输出点赞标签总数较少的那一个,这样可以保证每个标签出现的平均次数较少。
下面是代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
const int N=1e3+10;
struct node{
string name;
int cnt;//记录点赞的不同标签的数量
int sum;//记录点赞的总数
}p[N];
set<int>s;//记录每个标签是否出现过
bool cmp(node a,node b)
{
if(a.cnt!=b.cnt) return a.cnt>b.cnt;
return a.sum<b.sum;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
s.clear();
cin>>p[i].name>>p[i].sum;
for(int j=1;j<=p[i].sum;j++)
{
int t;
scanf("%d",&t);
s.insert(t);
}
p[i].cnt=s.size();
}
sort(p+1,p+n+1,cmp);
if(n==1) cout<<p[1].name<<" -"<<" -";
else if(n==2) cout<<p[1].name<<' '<<p[2].name<<" -";
else cout<<p[1].name<<' '<<p[2].name<<' '<<p[3].name;
return 0;
}