点赞狂魔
问题描述:
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。
输入格式: 输入在第一行给出一个正整数N(≤100),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name KF1⋯FK”,其中Name是不超过8个英文小写字母的非空用户名,1≤K≤1000,Fi(i=1,⋯,K)是特性标签的编号,我们将所有特性标签从1 到 107 编号。数字间以空格分隔。
输出格式:
统计每个人点赞的不同标签的数量,找出数量最大的前3名,在一行中顺序输出他们的用户名,其间以1个空格分隔,且行末不得有多余空格。如果有并列,则输出标签出现次数平均值最小的那个(意思:标签数少的先输出),题目保证这样的用户没有并列。若不足3人,则用-补齐缺失,例如mike
jenny -就表示只有2人。
样例输入:
5
bob 11 101 102 103 104 105 106 107 108 108 107 107
peter 8 1 2 3 4 3 2 5 1
chris 12 1 2 3 4 5 6 7 8 9 1 2 3
john 10 8 7 6 5 4 3 2 1 7 5
jack 9 6 7 8 9 10 11 12 13 14
样例输出:
jack chris john
思路:结构体要存储name、标签个数、标签;
struct person{
char name[11];
int cnt;//有效的数字即不重复的数字个数
int num;//总的个数
}p[101];
然后用set容器存储这些标签(set集合内不存在重复的数),排序、输出结果
c++代码
#include<bits/stdc++.h>
using namespace std;
struct person{
char name[11];
int cnt;//有效的数字即不重复的数字个数
int num;//总的个数
}p[101];
bool cmp(person a,person b)//sort()的排序函数
{
if(a.cnt!=b.cnt)
return a.cnt>b.cnt;
return
a.num<b.num;
}
int main()
{
int k,n,x;
cin >> n;
set<int>s;
for(int i = 0;i<n;i++)
{
cin >> p[i].name >> k;
s.clear();
for(int j = 0;j<k;j++)
{
cin >> x;
s.insert(x);
}
p[i].cnt = s.size();
p[i].num = k;
}
sort(p,p+n,cmp);
//控制输入输出
if(n<3)
{
for(int i = 0;i<n;i++)
{
cout << p[i].name<< " " ;
}
for(int i = n;i<3;i++)
{
if(i==n)
cout << "-";
else
cout << " " << "-";
}
}
else
{
for(int i = 0;i<3;i++)
{
if(i==0)
cout << p[i].name ;
else
cout <<" " << p[i].name;
}
}
return 0;
}
不使用stl的set容器,只要剔除掉相同的标签就可以 代码如下
#include<bits/stdc++.h>
using namespace std;
struct person{
char name[11];
int *cnt;
int cou;
int num;
}p[101];
bool cmp(person a,person b)
{
if(a.cou!=b.cou)
return a.cou>b.cou;
return a.num<b.num;
}
int main()
{
int n,j,i,k,number;
int flag = 0;
cin >> n;
for( i = 0;i<n;i++)
{
cin >> p[i].name >>p[i].num;
p[i].cnt = (int *)malloc(sizeof(int)*p[i].num);
if(p[i].cnt==NULL)
return -1;
for( j = 0;j<p[i].num;j++)
{
cin >> number;
flag = 0;
for(k = 0;k<p[i].cou;k++)
{
if(p[i].cnt[k]==number)
{
flag++;
break;
}
}
if(!flag)
{
p[i].cou++;
p[i].cnt[k]=number;
}
flag = 0;
}
}
sort(p,p+n,cmp);
if(n<3)
{
for(int i = 0;i<n;i++)
{
cout << p[i].name<< " " ;
}
for(int i = n;i<3;i++)
{
if(i==n)
cout << "-";
else
cout << " " << "-";
}
}
if(n>3)
{
for(int i = 0;i<3;i++)
{
if(i==0)
cout << p[i].name;
else
cout << " "<<p[i].name;
}
}
}
注意:此题并没有在OJ上测试过,只进行了一些简单样例的测试,所以输出可能有问题,希望大家指正!