(一)读懂题目
关键句:期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
最后,让我们输出排在前五的学生的座号以及分数
(二)分析算法+时间复杂度和空间复杂度
算法:选择排序
时间复杂度:O(n*n)
空间复杂度:O(1)——虽然要存储很多学生,但还是常数项
(三)代码实现
# include <iostream>
# include <cstdio>
using namespace std;
int n, maxn= - 1 ;
int a[ 305 ] , b[ 305 ] , c[ 305 ] , d[ 305 ] , e[ 305 ] ;
int main ( ) {
cin>> n;
for ( int i= 1 ; i<= n; i++ )
{
cin>> a[ i] ;
cin>> b[ i] ;
cin>> c[ i] ;
d[ i] = a[ i] + b[ i] + c[ i] ;
e[ i] = i;
}
for ( int i= 1 ; i< n; i++ )
{
for ( int j= i+ 1 ; j<= n; j++ )
{
if ( d[ i] < d[ j] )
{
swap ( d[ i] , d[ j] ) ;
swap ( a[ i] , a[ j] ) ;
swap ( b[ i] , b[ j] ) ;
swap ( c[ i] , c[ j] ) ;
swap ( e[ i] , e[ j] ) ;
}
if ( d[ i] == d[ j] )
{
if ( a[ i] < a[ j] )
{
swap ( d[ i] , d[ j] ) ;
swap ( a[ i] , a[ j] ) ;
swap ( b[ i] , b[ j] ) ;
swap ( c[ i] , c[ j] ) ;
swap ( e[ i] , e[ j] ) ;
}
if ( a[ i] == a[ j] )
{
if ( e[ i] > e[ j] )
{
swap ( d[ i] , d[ j] ) ;
swap ( a[ i] , a[ j] ) ;
swap ( b[ i] , b[ j] ) ;
swap ( c[ i] , c[ j] ) ;
swap ( e[ i] , e[ j] ) ;
}
}
}
}
}
for ( int i= 1 ; i<= 5 ; i++ )
{
cout<< e[ i] << " " << d[ i] << endl;
}
return 0 ;
}
(四)总结反思
本题虽然题目长了点,条件多了点,但毕竟万变不离其宗,考察的还是排序算法,对,就我之前发的。
本题我是选择了用选择排序,复杂度是n*n,在本题中并不算多,一遍AC过^_^