区队选拔

来源:互联网 发布:工程动画软件 编辑:程序博客网 时间:2024/05/16 14:01

【问题描述】
一年一度的合肥市小学信息学竞赛即将开始。为了选拔参加比赛的选手,某区进行了信息学选拔活动,因为名额有限,需要根据选拔考试的成绩由高到底选择参加市赛的人员。
选拔考试有3道试题,参加考试的学生人数有N个人,最终只能有M个人参加市赛。选拔规则如下:
先按总分从高到低排序,如果两个同学总分相同,再按第一题得分从高到低排序,如果两个同学总分和第一题得分都相同,那么规定考号小的同学排在前面,这样,每个学生的排序是唯一确定的。
你的任务是先根据输入的3道试题的分数(每道题总分100分)计算总分,然后按上述规则排序,最后按排名顺序输出能参加市赛的考号和总分。
【输入格式】 select.in
输入文件包含n+1行:
第1行为两个正整数N和M,表示参加选拔的学生人数和最终参加市赛的人数。
第2到N+1行,每行有3个用空格隔开的数字,每个数字都在O到100之间,第j行的3个数字依次表示考号为j-1的学生的第一、第二、第三道题目的成绩。每个学生的考号按照输入顺序编号为l~N (恰好是输入数据的行号减1)。
所给的数据都是正确的,不必检验。
【输出格式】select.out
输出文件共有M行,每行是两个用空格隔开的正整数,依次表示前M名学生的考号和总分。
【样例输入】
5 2
78 44 40
91 91 83
98 51 54
61 88 33
77 46 83
【样例输出】
2 265
5 206
【数据范围】
0<=M

#include<bits/stdc++.h>using namespace std;struct Edge{int num,a,b,c,sum;  }s[400];int cmp(Edge x,Edge y){    if(x.sum==y.sum)     {        if(x.a==y.a) return x.num<y.num;    else return x.a>y.a;    }    else return x.sum>y.sum;}int main(){    int n,m,i;    cin>>n>>m;    for(i=0;i<n;i++)    {        cin>>s[i].a>>s[i].b>>s[i].c;        s[i].sum=s[i].a+s[i].b+s[i].c;        s[i].num=i+1;    }    sort(s,s+n,cmp);    for(i=0;i<m;i++)    cout<<s[i].num<<' '<<s[i].sum<<"\n";    return 0;}
原创粉丝点击