一、题目
二、解题思路
- 统计每个人点赞的不同标签的数量:每行列出一位用户的点赞标签,这些标签可能有重复的,所以将用户的点赞标签存放在 set 里,通过 size() 函数获得点赞的不同标签的数量;
- 结构体包括用户的信息:姓名 name 、点赞标签的数量 sum 、点赞的不同标签的数量 cot;
- 冒牌排序对结构体进行排序,排序规则:按照 cot 降序排序,若 cot 相同,则按照 sum 升序排序。
三、代码
#include<iostream>
using namespace std;
#include<set>
struct User
{
string name;
int sum;
int cot;
}a[105];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].name>>a[i].sum;
set<int> t;
for(int j=0;j<a[i].sum;j++)
{
int id;
cin>>id;
t.insert(id);
}
a[i].cot=t.size();
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(a[j].cot<a[j+1].cot || (a[j].cot==a[j+1].cot &&a[j].sum>a[j+1].sum))
{
struct User t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
cout<<a[0].name;
for(int i=1;i<3;i++)
{
if(n>=(i+1))
{
cout<<" "<<a[i].name;
}
else
{
cout<<" "<<"-";
}
}
return 0;
}
四、总结
题目中 “如果有并列,则输出标签出现次数平均值最小的那个” 可以理解为 sum / cot 最小,因为 cot 是相同的,所以找 sum 最小的那个即可。