Time Limit: 10 second

Memory Limit: 2 MB

问题描述

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)
是: 7 279 5 279 这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是: 5 279 7 279 则按输出错误处理,不能得分。

Input

输入文件scholar.in包含n+1行: 第1行为一个正整数n,表示该校参加评选的学生人数。 第2到n+1行,每行有3个用空格隔开的数字,每个数字都在O到100之间z第1行的3个数 字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为l~n (恰好是输入数据的行号减1)。 所给的数据都是正确的,不必检验。

Output

输出文件scholar.out共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。

Sample Input

10
78 44 40
91 91 83
98 51 54
61 88 33
77 46 83
76 93 67
66 68 61
76 35 69
68 79 36
90 90 84

Sample Output

2 265
10 264
6 236
5 206
3 203

【题解】

可以在快排那个过程上多加一个变量k,用来表示当前的快排使用的关键字是什么,1表示以总分为关键字,2表示以语文为关键字,3表示以学号为关键字。都是从小到大排序。

在以总分为关键字排完一遍后,找到总分相同的一些连续位置,将这些位置上的数再以语文为关键字再排一遍,然后再找到连续的总分,语文成绩都相同的位置,将这些位置上的数再以学号为关键字从小到大排。

【代码】

#include <cstdio>
#include <stdlib.h> int n,a[20000][4]; //1存总成绩 2存语文成绩 3存学号 void kp(int l,int r,int k) //表示以k为关键字
{
int i = l,j = r,m = a[(i+j)/2][k];
do
{
while (a[i][k] < m) i++;
while (m < a[j][k]) j--;
if (i <= j)
{
a[0][1] = a[i][1];a[i][1] = a[j][1];a[j][1] = a[0][1]; //a[0]=a[i]这样的代码不能用。。
a[0][2] = a[i][2];a[i][2] = a[j][2];a[j][2] = a[0][2];
a[0][3] = a[i][3];a[i][3] = a[j][3];a[j][3] = a[0][3];
i++;j--;
}
}
while (i <= j);
if (l < j) kp(l,j,k);
if (i < r) kp(i,r,k);
} void input_data()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++) //只要获取总分,语文成绩,学号这3个信息就可以了 其他东西可以舍弃掉
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[i][1] = x + y + z;
a[i][2] = x;
a[i][3] = i;
}
kp(1,n,1); //先以总分为关键字排序
int i = 1;
while (i <= n) //找到总分相同的位置,再以语文为关键字进行排序
{
int j = i+1;
while (a[i][1] == a[j][1]) j++;
kp(i,j-1,2);
i = j;
}
i = 1;
while (i <= n) //找到总分,语文相同的位置,这些位置上的数再以学号为关键字进行排序。
{
int j = i+1;
while (a[i][1] == a[j][1] && a[i][2] == a[j][2]) j++;
kp(i,j-1,3);
i = j;
}
} void output_ans()
{
for (int i = n;i >= n-4;i--)
printf("%d %d\n",a[i][3],a[i][1]);
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
output_ans();
return 0;
}

【代码2】

#include <algorithm>
#include <cstdio> using namespace std; struct message
{
int zongfen,yuwen,xuehao;
}; message a[10000]; int cmp(const message &a,const message &b) //用结构体进行排序。可以根据不同的关键字排 很方便
{
if (a.zongfen > b.zongfen)
return 1;
if (a.zongfen == b.zongfen && a.yuwen > b.yuwen)
return 1;
if (a.zongfen == b.zongfen && a.yuwen == b.yuwen && a.xuehao < b.xuehao)
return 1;
return 0; //return 1表示这就是需要的排序方式。
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
int n;
scanf("%d",&n);
for (int i = 1;i <= n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[i].zongfen = x+y+z; //只要记录总分.语文成绩。还有学号就可以了
a[i].yuwen = x;
a[i].xuehao = i;
}
sort(a+1,a+1+n,cmp); //调用sort函数
for (int i = 1;i <= 5;i++)
printf("%d %d\n",a[i].xuehao,a[i].zongfen);
return 0;
}

【9206】 奖学金(NOIP2007)的更多相关文章

  1. NOIP2007 T1奖学金 解题报告-S.B.S.

    洛谷P1093 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同, ...

  2. [NOIP2007]奖学金

      题目来源:http://www.luogu.org/problem/show?pid=1093# 2007年NOIP全国联赛普及组 [题目描述 Description] 某小学最近得到了一笔赞助, ...

  3. NOIP2007奖学金题解——洛谷1093

    题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高 ...

  4. NOIP2007 奖学金 结构体排序

    是结构体排序的练习题,可供选手们巩固结构体排序的一些相关内容. 关于结构体排序 1.结构体定义 struct student { int num,a,b,c,sum; }p[]; 2.结构体初始化 ; ...

  5. vijos1431[noip2007]守望者的逃离(背包动规)

    描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者 在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这 个荒岛施咒,这座岛很快就会 ...

  6. [BZOJ1999][codevs1167][Noip2007]Core树网的核

    [BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(t ...

  7. ACM 谁获得了最高奖学金

    谁获得了最高奖学金 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述     某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: ...

  8. P1093 奖学金

    奖学金 题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果两个同学总分相同,再按语文 ...

  9. TYVJ P1002 谁拿了最多奖学金 Label:模拟 水

    背景 NOIP2005复赛提高组第一题 描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同:1)     院士奖学金,每人8000元,期末平均成绩高于80分( ...

随机推荐

  1. QQ群功能设计与心理学

    刚刚在一个Java技术交流群,发了个 "博客投票"的广告. 群主两眼一黑,瞬间就把我给干掉了. 看到QQ给出的系统消息,发现QQ群的一个功能做得很不错. 大家注意到,右边有个&qu ...

  2. Altium Designer如何对齐原件

    右边那个图标是排列菜单

  3. (转)ORA-01940: cannot drop a user that is currently connected 问题解析

    删除数据库用户的时候经常会遇到这样的错误: ORA: cannot drop a user that is currently connected 原因是有程序在连接我们需要删除的用户,我们删除用户之 ...

  4. 【习题 3-10 UVA - 1587】Box

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举某个顶角的三个相邻面就好. 看看这三个相邻面有没有对应的面. 以及3个相邻面的6个边. 能否分成2个a,2个b,2个c 也即每个 ...

  5. 【z07】机器翻译

    [题目链接]:http://noi.qz5z.com/viewtask.asp?id=z07 [题解] 可以理解为一直往一个队列里面加东西: 然后每次查找一个东西在不在队列的最尾部长度为m的区间范围内 ...

  6. js进阶 12-8 如何知道上一个函数的返回值是什么(如何判断上一个函数是否执行成功)

    js进阶 12-8 如何知道上一个函数的返回值是什么(如何判断上一个函数是否执行成功) 一.总结 一句话总结:event的result属性即可. 1.event的result属性的实际应用场景是什么? ...

  7. 两个常见Qt编译错误的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 如果在电脑上安装了两个Qt版本,在编译一个工程时有可能出现如下的编译错误: ERROR: failed to refr ...

  8. 数据结构与算法实验题 6.1 s_sin’s bonus

    数据结构与算法实验题 6.1 s_sin's bonus ★实验任务 正如你所知道的 s_sin 是一个非常贪玩的人 QAQ(如果你非常讨厌他请直接从第二段开 始看),并且令人感到非常遗憾的是,他是一 ...

  9. php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结)

    php面试题二--解决网站大流量高并发方案(从url到硬盘来解决高并发方案总结) 一.总结 从外到内解决网站大流量高并发问题---从提交一个url开始(从用户按下搜索栏回车键开始) url最开始会到d ...

  10. Python 奇葩语法

    a = 1, 2, 3 赋值后的结果,a == (1, 2, 3),将一个元组(tuple)赋给了变量 a (1, 2) + (3, ) ⇒ (1, 2, 3),并不能说明 tuple 可以添加新的元 ...