标签:
试题描述
|
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。 任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是: 7279 5279 这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是: 5279 7279 则按输出错误处理,不能得分。
|
输入
|
包含n+1行:
第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 【输入样例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 |
输出示例
|
【输出样例1】
6 265 4 264 3 258 2 244 1 237 【输入样例1】 8 265 2 264 6 264 1 258 5 258 |
其他说明
|
【限制】50%的数据满足:各学生的总成绩各不相同 100%的数据满足: 6<=n<=300
|
炒鸡简单的一道题。下面贡献两份代码
第一份:普通版
1 #include <iostream> 2 3 using namespace std; 4 5 int main(int argc, char *argv[]) 6 { 7 int n,c[305]={0},m[305]={0},e[305]={0},i,j,s[305]={0},x[305]={0}; 8 cin>>n; 9 for(i=1;i<=n;i++) 10 { 11 cin>>c[i]; 12 cin>>m[i]; 13 cin>>e[i]; 14 s[i]=c[i]+m[i]+e[i]; 15 x[i]=i; 16 //cout<<c[i]<<" "<<m[i]<<" "<<e[i]<<" "<<s[i]<<endl; 17 } 18 for(i=1;i<n;i++) 19 { 20 for(j=i+1;j<=n;j++) 21 { 22 if(s[i]<s[j]) 23 { 24 swap(s[i],s[j]); 25 swap(c[i],c[j]); 26 swap(x[i],x[j]); 27 } 28 else if(s[i]==s[j]) 29 { 30 if(c[i]<c[j]) 31 { 32 swap(s[i],s[j]); 33 swap(c[i],c[j]); 34 swap(x[i],x[j]); 35 36 } 37 else if(c[i]==c[j]) 38 { 39 if(x[i]>=x[j]) 40 { 41 swap(s[i],s[j]); 42 swap(c[i],c[j]); 43 swap(x[i],x[j]); 44 } 45 } 46 } 47 } 48 //cout<<x[i]<<" "<<s[i]<<endl; 49 } 50 for(i=1;i<=5;i++) 51 { 52 cout<<x[i]<<" "<<s[i]<<endl; 53 } 54 return 0; 55 }
第二份:运算符重载版。最近新学会的运算符重载,还挺方便的。
1 #include <iostream> 2 3 using namespace std; 4 struct data //运算符重载 5 { 6 int num,ch,z,ma,eng; 7 bool operator<(const data &a)const 8 { 9 if(z>a.z) return true; //用原来的总分和当前比,如果大,不用交换 10 else if(z==a.z && ch>a.ch) return true; //如果总分一样,比语文 11 else if(z==a.z && ch==a.ch && num<a.num) return true; //如果总分和语文都一样,比学号 12 else return false; 13 } 14 }a[400]; 15 int main() 16 { 17 int n,i,j; 18 scanf("%d",&n); 19 for(i=1;i<=n;i++) 20 { 21 a[i].num=i; 22 scanf("%d%d%d",&a[i].ch,&a[i].ma,&a[i].eng); 23 a[i].z=a[i].ch+a[i].ma+a[i].eng; 24 } 25 sort(a+1,a+n+1); 26 for(i=1;i<=5;i++) 27 { 28 printf("%d %d\n",a[i].num,a[i].z); //‘\n‘是回车 29 } 30 return 0; 31 }
标签:
原文地址:http://www.cnblogs.com/YXY-1211/p/5150209.html