这里附上原题链接。
解题思路:
如果数量标记是负数或者0则不用处理,如果标记只是正数,只需时间加上这个正数,如果标记中是 a(b)的形式,那么时间就要加上 a + b * m(m是每次错误提交的罚分) 。
解题步骤:
- 创建结构体数组,结构体包括参赛者的名字,排名,解题时间。
- 输入信息
- 对结构体进行排序
AC代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp( const void * a , const void * b ) ;
typedef struct
{
char name[ 15 ] ;
int time ;
int num ;
} Student ;
Student student[ 1010 ] ;
int main()
{
int n , m , num1 , i , a , b ;
num1 = 0 ;
scanf("%d %d", &n , &m ) ;
while( scanf("%s",student[num1].name) != EOF )
{
student[ num1 ].num = student[ num1 ].time = 0 ;
for( i = 0 ; i < n ; i++ )
{ //scanf( "%d(%d)", &a , &b )很好地解决了输入括号的问题
if( scanf( "%d(%d)", &a , &b ) == 2 )
{
student[ num1 ].num++;
student[ num1 ].time+=( a+b*m ) ;
}
else{
if( a > 0 )
{
student[ num1 ].num++ ;
student[ num1 ].time += a ;
}
}
}
num1++;
}
qsort( student , num1 ,sizeof( Student ) , cmp ) ;//yongc语言的内置函数对结构体进行排序
for( i = 0 ; i < num1 ; i++ )
printf( "%-10s %2d %4d\n", student[i].name , student[i].num , student[i].time ) ;
return 0 ;
}
int cmp(const void *a,const void *b){
Student * p = ( Student * ) a ;
Student * q = ( Student * ) b ;
if( p->num != q->num )
return q->num - p->num ;
else if( p->time != q->time )
return p->time - q->time ;
else
return strcmp( p->name , q->name ) ;
}