7-5 点赞狂魔
程序员文章站
2022-06-07 23:42:17
...
7-5 点赞狂魔(25 分)
微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。
输入格式:
输入在第一行给出一个正整数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>
#include<string.h>
struct student{
char name[9];
int Num;
int Tag[1000];
int WorkNum;
double Average;
};
int main()
{
int i, j, n, T ,u;
double R;
char CH[15];
scanf("%d", &n);
struct student Student[n];
for( i=0; i<n; i++ ) {
scanf("%s", &Student[i].name);
scanf("%d", &Student[i].Num);
Student[i].WorkNum=0;
for( j=0; j<Student[i].Num; j++ )
scanf( "%d", &Student[i].Tag[j] );
}
for( i=0; i<n; i++ )
for( u=0; u<Student[i].Num-1; u++ )
for( j=u+1; j<Student[i].Num; j++ )
if(Student[i].Tag[u]==Student[i].Tag[j])
Student[i].Tag[j] = 0;
for( i=0; i<n; i++ ) {
for( j=0; j<Student[i].Num; j++ )
if(Student[i].Tag[j]!=0)
Student[i].WorkNum++;
Student[i].Average = (double)Student[i].Num/Student[i].WorkNum;
}
for( i=0; i<n-1; i++ )
for( j=i+1; j<n; j++ )
if( Student[i].WorkNum < Student[j].WorkNum ){
strcpy(CH, Student[i].name);
strcpy(Student[i].name, Student[j].name);
strcpy(Student[j].name, CH);
T = Student[i].WorkNum;
Student[i].WorkNum=Student[j].WorkNum;
Student[j].WorkNum=T;
R=Student[i].Average;
Student[i].Average=Student[j].Average;
Student[j].Average=R;
}
for( i=0; i<n; i++ )
for( j=i+1; j<n; j++ )
if( Student[i].WorkNum==Student[j].WorkNum&&Student[i].Average>Student[j].Average ){
strcpy(CH, Student[i].name);
strcpy(Student[i].name, Student[j].name);
strcpy(Student[j].name, CH);
R=Student[i].Average;
Student[i].Average=Student[j].Average;
Student[j].Average=R;
}
if( n>2 )
for( i=0; i<3; i++ ) {
printf("%s",Student[i].name);
if(i<2)
printf(" ");
if( !Student[i+1].name )
break;
}
if( i==1 )
printf("%s - -", Student[0].name);
if(i==2)
printf("%s %s -", Student[0].name, Student[1].name);
return 0;
}
第二个方法,我用数组做的,原理和结构一样:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Swap(int *a, int *b)
{
int t=*a; *a=*b; *b=t;
}
void Swapdouble(double *c, double *d)
{
double t=*c; *c=*d; *d=t;
}
int main()
{
int i, j, k, n, T;
scanf("%d", &n);
int Num[n], Tag[n][1000], Num1[n];
double R,Average[n];
char *name[200], CH[19];
for( i=0; i<n; i++ ) {
scanf("%s", CH);
name[i] = (char*)malloc(sizeof(char)*10);
strcpy( name[i], CH );
scanf("%d", &Num[i]);
Num1[i] = 0;
for( j=0; j<Num[i]; j++ )
scanf("%d", &Tag[i][j]);
}
for( i=0; i<n; i++ )
for( j=Num[i]-1; j>=0; j-- )
for( k=0; k>=0&&k<j; k++ )
if(Tag[i][j]==Tag[i][k])
Tag[i][j] = 0;
for( i=0; i<n; i++ )
for( j=0; j<Num[i]; j++ )
if( Tag[i][j]!=0 )
Num1[i]++;
for( i=0; i<n; i++ )
Average[i] = (double)Num[i]/Num1[i];
for( i=0; i<n-1; i++ )
for( j=i+1; j<n; j++ )
if( Num1[i]<Num1[j] ) {
Swap( &Num1[i], &Num1[j]);
Swapdouble(&Average[i], &Average[j]);
strcpy(CH, name[i]);
strcpy(name[i], name[j]);
strcpy(name[j], CH);
}
for( i=0; i<n-1; i++ )
for( j=i+1; j<n; j++ )
if( Num1[i]==Num1[j]&&Average[i]>Average[j]) {
strcpy(CH, name[i]);
strcpy(name[i], name[j]);
strcpy(name[j], CH);
Swapdouble(&Average[i], &Average[j]);
}
if( n>2 )
for( i=0; i<3; i++ ) {
printf("%s", name[i]);
if( i<2 ) printf(" ");
}
if( n==1 )
printf("%s - -", name[0]);
if( n==2 )
printf("%s %s-", name[0], name[1]);
return 0;
}
上一篇: FOJ 2123 数字的孔数