(一)读懂题目
关键句:期末,每个学生都有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过^_^