题解 | #[NOIP2007]奖学金#
[NOIP2007]奖学金
https://ac.nowcoder.com/acm/problem/16639
链接:https://ac.nowcoder.com/acm/problem/16639 来源:牛客网 C++解法 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是: 7 279 5 279 这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是: 5 279 7 279 则按输出错误处理,不能得分。 输入描述: 第1行为一个正整数n,表示该校参加评选的学生人数。 第2到n+1行,每行有3个用空格隔开的数字,每个数字都在O到100之间z第1行的3个数 字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为l~n (恰好是输入数据的行号减1)。 所给的数据都是正确的,不必检验。 输出描述: 共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。 示例1 输入 6 90 67 80 87 66 91 78 89 91 88 99 77 67 89 64 78 89 98 输出 6 265 4 264 3 258 2 244 1 237 示例2 输入 8 80 89 89 88 98 78 90 67 80 87 66 91 78 89 91 88 99 77 67 89 64 78 89 98 输出 8 265 2 264 6 264 1 258 5 258 备注: 50%的数据满足: 各学生的总成绩各不相同 100%的数据满足: 6 ≤ n ≤ 300
分析题目,我们得知需要输入的变量有:学生个数、语文成绩、数学成绩、英语成绩 输出变量:学号、总成绩 本题需要对数组进行排序,我们可以通过先判断数的大小后利用swap函数进行交换 注意要把所有的量全部进行交换,缺失了会出现数的交换紊乱的情况,别忘了在判断完总分大小后进行语文的分数排序交换,否则会错误50% 代码如下:
-
#include<bits/stdc++.h>
-
using namespace std;
-
int main()
-
{
-
int n,c[302],m[302],e[302],a[302]={},xh[302];//c语文,m数学,e英语,a总分,xh学号
-
cin>>n;
-
for(int i=0;i<n;i++)
-
{
-
cin>>c[i]>>m[i]>>e[i];
-
-
a[i]=c[i]+m[i]+e[i];
-
-
-
xh[i]=i+1;//输入成绩并标上学号
-
-
-
}
-
-
-
for(int i=n;i>1;i--)
-
-
-
{
-
-
-
for(int j=0;j<i-1;j++)//冒泡
-
-
-
{
-
-
-
if(a[j]<a[j+1])
-
-
-
{
-
-
-
swap(a[j],a[j+1]);
-
-
-
swap(c[j],c[j+1]);
-
-
-
swap(m[j],m[j+1]);
-
-
-
swap(e[j],e[j+1]);
-
-
-
swap(xh[j],xh[j+1]);//交换所有数据
-
-
-
}
-
-
-
else if(a[j]==a[j+1])//判断语文成绩
-
-
-
{
-
-
-
if(c[j]<c[j+1])
-
-
-
{
-
-
-
swap(a[j],a[j+1]);
-
-
-
swap(c[j],c[j+1]);
-
-
-
swap(m[j],m[j+1]);
-
-
-
swap(e[j],e[j+1]);
-
-
-
swap(xh[j],xh[j+1]);
-
-
-
}
-
-
-
}
-
-
-
}
-
-
-
}
-
-
-
for(int i=0;i<5;i++)
-
-
-
cout<<xh[i]<<" "<<a[i]<<endl; //注:输出前五名,故i=0;i<5,不要多输
-
-
-
}
-