输入格式:
输入在第一行给出一个正整数N(≤100),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name
K F1⋯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
#include<stdio.h>
struct node{
char name[100];
int num1;
int num2[1000];
double average;
}qiu[100];
int x,i,j,s=0,t,y=0,pop;
int sum = 0,count[1000];
void dianzan1(){ //如果输入的用户数为1
scanf("%s %d",qiu[0].name,&qiu[0].num1);
for(i=0; i<qiu[0].num1; i++)
scanf("%d",&qiu[0].num2[i]);
printf("%s ",qiu[0].name);
printf("- -");
}
void dianzan2(int x){ //如果输入的用户数为2
for(i=0; i<x; i++){
scanf("%s %d",qiu[i].name,&qiu[i].num1);
for(j=0; j<qiu[i].num1; j++){
scanf("%d",&qiu[i].num2[j]);
if(j==0){
sum = qiu[i].num2[j];
continue;
}
else{
for(t=0; t<j; t++){
if(sum!=qiu[i].num2[t])
count[i]++;
}
sum = qiu[i].num2[j];
}
}
}
if(count[0]>=count[1]){
printf("%s %s ",qiu[0].name,qiu[1].name);
printf("-");
}
else{
printf("%s %s ",qiu[1].name,qiu[0].name);
printf("-");
}
}
void dianzan3(int x){ //如果输入的用户数大于等于3
for(i=0; i<x; i++){
scanf("%s %d",qiu[i].name,&qiu[i].num1);
for(j=0; j<qiu[i].num1; j++){
scanf("%d",&qiu[i].num2[j]);
sum = qiu[i].num2[j];
for(t=0; t<j; t++){ //这个循环用来判断当前输入的数是否与之前的数重复
if(sum!=qiu[i].num2[t])
y++;
}
if(y==t)
count[i]++; //如果无重复,标签数count[i]加1
y=0;
}
qiu[i].average = qiu[i].num1*1.0/count[i]*1.0; //标签出现次数平均值
}
for(i=0; i<3; i++){
pop = count[0];
for(j=0; j<x; j++){
if(count[j]>=pop){ //找最大标签种类数
pop = count[j];
s = j;
}
}
t = s;
for(y = 0; y<x; y++){
if(pop==count[y]){ //如果两个标签的种类数相同
if(qiu[s].average<qiu[y].average)
t = s;
else if(qiu[s].average>qiu[y].average)
t = y;
}
}
printf("%s",qiu[t].name);
count[t] = 0; //将输出后的那个人的标签种类数标为0,即让他变成最小的,此后就不
//带他玩了
if(i<2)
printf(" ");
}
}
int main(){
scanf("%d",&x);
if(x==1)
dianzan1();
else if(x==2)
dianzan2(2);
else if(x>=3)
dianzan3(x);
return 0;
}