7-5 点赞狂魔

4 篇文章 1 订阅

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


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

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


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值