天梯赛L2-021 点赞狂魔
题目详情:
思路:
本题的思路比较简单:就是统计点赞不同标签的个数,然后输出个数最多的三个人。
1、去除重复的标签,可以用set容器存储,因为不需要打印标签,所以我们可以在循环中建立set,只用来统计标签的种类数量
2、标签的种类和名字又要一一对应起来又想到了map,但是map显然不可以,因为map是一一对应,而本题一个人对应多个标签,所以要用结构体
3、因为要输出种类最多的三个名字,所以要排序,排序图省事,就用sort函数,因为涉及结构体,所以要重载运算符,还要考虑并列的情况,所以呢,重载运算符的时候考虑两种情况
详细代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
int N,k;
struct node
{
string name;//点赞人的名字
int cnt;// 点赞的标签
int num;// 点赞的总数
}person[maxn];
bool cmp(node x,node y)//运算符重载,用于对结构体的排序
{
if(x.cnt != y.cnt) //如果不出现并列
return x.cnt > y.cnt;//按照大于关系,直接降序排列
else
return x.num < y.num;//按照小于关系,直接升序排列
}
int main()
{
cin>>N;
set<int>s;//利用set容器的集合性质:不能有重复元素
int a;
for(int i=0; i<N; i++)
{
cin>>person[i].name>>k;//输入名字和总点赞次数
s.clear();//每一次循环都要将s置空
for(int j=0; j<k; j++)//
{
cin>>a;
s.insert(a);
}
person[i].cnt = s.size();//将set容器中元素的个数,即点赞的标签种类赋给cnt
person[i].num = k;//因为题目中说并列的情况:输出标签出现次数平均值最小的那个
}
sort(person, person + N, cmp);//将结构体person中按照cmp重载的运算符排序
if(N < 3)//输出名字的个数不足3个的情况
{
for(int i=0; i<N; i++)
{
if(i != 0)
cout<<" ";
cout<<person[i].name;
}
for(int i=N; i<3; i++)//N小于3,按照题目要求输出"-"
{
cout<<" -";
}
}
else
{
for(int i=0; i<3; i++)
{
if(i != 0)
cout<<" ";
cout<<person[i].name;
}
}
}
知识总结:
本题遇到的知识点:
利用set的集合特点存放标签,set的大小可以帮我们确定标签的数量
结构体重载运算符,帮我们确定输出顺序