欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

7-5 点赞狂魔

程序员文章站 2022-06-07 23:42:17
...

7-5 点赞狂魔(25 分)

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。

输入格式:

输入在第一行给出一个正整数N100),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name K F1FK”,其中Name是不超过8个英文小写字母的非空用户名,1K1000Fii=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; 
} 

7-5 点赞狂魔

   第二个方法,我用数组做的,原理和结构一样:

#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; 
}