华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2120|回复: 6
打印 上一主题 下一主题

P1093 奖学金

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-4-22 13:23:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
题目描述
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7 279 5 279 这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:

5 279 7 279 则按输出错误处理,不能得分。

输入输出格式
输入格式:
输入文件scholar.in包含n+1行:

第1行为一个正整数n,不超过300,表示该校参加评选的学生人数。

第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第j行的3个数字依次表示学号为j-1的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n(恰好是输入数据的行号减1)。

所给的数据都是正确的,不必检验。

//感谢 黄小U饮品 修正输入格式

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

输入输出样例
输入样例#1:
6
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

输入样例#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
输出样例#2:
8 265
2 264
6 264
1 258
5 258
回复

使用道具 举报

9

主题

89

帖子

292

积分

华一学生

积分
292
沙发
发表于 2018-4-22 18:25:28 | 只看该作者
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int n;
  5. const int mx=310;
  6. int a[mx],b[mx],c[mx],sum[mx],number[mx];
  7. int i,j;
  8. bool cmp(int x,int y)
  9. {
  10.     if (sum[x]<sum[y]) return 0;
  11.     else if (sum[x]>sum[y]) return 1;
  12.     else
  13.     {
  14.         if (a[x]<a[y]) return 0;
  15.         else if (a[x]>a[y]) return 1;
  16.         else return number[x]<number[y];
  17.     }
  18. }
  19. void change(int x,int y)
  20. {
  21.     swap(a[x],a[y]);
  22.     swap(b[x],b[y]);
  23.     swap(c[x],c[y]);
  24.     swap(number[x],number[y]);
  25.     swap(sum[x],sum[y]);
  26. }
  27. int main()
  28. {
  29.     cin>>n;
  30.     for (i=1; i<=n; i++)
  31.     {
  32.         cin>>a[i]>>b[i]>>c[i];
  33.         sum[i]=a[i]+b[i]+c[i];
  34.         number[i]=i;
  35.     }
  36.     for (i=1; i<=n; i++)
  37.         for (j=1; j<=n; j++)
  38.         {
  39.             if (cmp(i,j)) change(i,j);
  40.         }
  41.     for (i=1; i<=5; i++)
  42.         cout<<number[i]<<" "<<sum[i]<<endl;
  43.     return 0;
  44. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

158

帖子

470

积分

华一学生

积分
470
QQ
板凳
发表于 2018-4-29 19:51:40 | 只看该作者
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int n;
  5. struct student
  6. {
  7.     int yuwen,shuxue,yingyu,num;
  8.     int sum;
  9. }a[301];
  10. int comp(student &a,student &b)
  11. {
  12.     if(a.sum>b.sum)return 1;
  13.     if(a.sum<b.sum)return 0;
  14.     if(a.yuwen>b.yuwen)return 1;
  15.     if(a.yuwen<b.yuwen)return 0;
  16.     if(a.num<b.num)return 1;
  17.     if(a.num>b.num)return 0;
  18. }
  19. int main()
  20. {
  21.     cin>>n;
  22.     for(int i=1; i<=n; i++)
  23.     {
  24.         cin>>a[i].yuwen>>a[i].shuxue>>a[i].yingyu;
  25.         a[i].num=i;
  26.         a[i].sum=a[i].yuwen+a[i].shuxue+a[i].yingyu;
  27.     }
  28.     sort(a+1,a+n+1,comp);
  29.     for(int i=1; i<=5; i++)
  30.         cout<<a[i].num<<' '<<a[i].sum<<endl;
  31.     return 0;
  32. }
复制代码
回复 支持 反对

使用道具 举报

9

主题

15

帖子

57

积分

注册会员

Rank: 2

积分
57
地板
发表于 2018-4-29 20:54:27 | 只看该作者
本帖最后由 王令欧 于 2018-4-29 20:55 编辑
  1. #include <stdio.h>//王令欧

  2. int main()
  3. {
  4.     int n,i,j,t;
  5.     int num[301]={0},chinese[301]={0},maths[301]={0},english[301]={0},score[301]={0};
  6.     scanf("%d",&n);
  7.     for(i=1;i<=n;i++)
  8.     {
  9.         scanf("%d%d%d",&chinese[i],&maths[i],&english[i]);
  10.         num[i]=i;
  11.         score[i]=chinese[i]+maths[i]+english[i];//输入并算出总分
  12.     }
  13.     for(i=1;i<=n;i++)
  14.         for(j=i+1;j<=n;j++)
  15.         {
  16.             if(score[i]<score[j])//总分排序
  17.             {
  18.                 t=num[i];
  19.                 num[i]=num[j];
  20.                 num[j]=t;
  21.                
  22.                 t=score[i];
  23.                 score[i]=score[j];
  24.                 score[j]=t;
  25.             }
  26.             if(score[i]==score[j])
  27.             {
  28.                 if(chinese[i]<chinese[j])//语文排序
  29.                 {
  30.                     t=num[i];
  31.                     num[i]=num[j];
  32.                     num[j]=t;
  33.                     
  34.                     t=score[i];
  35.                     score[i]=score[j];
  36.                     score[j]=t;
  37.                 }
  38.                 if(chinese[i]==chinese[j])
  39.                     if(num[i]>num[j])//学号排序
  40.                     {
  41.                         t=num[i];
  42.                         num[i]=num[j];
  43.                         num[j]=t;
  44.                         
  45.                         t=score[i];
  46.                         score[i]=score[j];
  47.                         score[j]=t;
  48.                     }
  49.             }
  50.         }
  51.     for(i=1;i<=5;i++)
  52.         printf("%d %d\n",num[i],score[i]);//输出前5名
  53.     return 0;
  54. }
复制代码
回复 支持 反对

使用道具 举报

2

主题

105

帖子

306

积分

中级会员

Rank: 3Rank: 3

积分
306
5#
发表于 2018-7-29 23:55:46 | 只看该作者
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <algorithm>
  7. using namespace std;

  8. int main(){
  9.         int n,i,j,a[350],b[350],c[350],a2,x,y,z;
  10.         scanf("%d",&n);
  11.         for(i=1;i<=n;i++)
  12.         {
  13.                 scanf("%d %d %d",&x,&y,&z);
  14.                 a[i]=x+y+z;
  15.                 b[i]=x;
  16.                 c[i]=i;
  17.         }
  18.         for(i=1;i<=n-1;i++)
  19.         {
  20.                 for(j=1;j<=n-i;j++)
  21.                 {
  22.                         if(a[j]<a[j+1])
  23.                         {
  24.                                 a2=a[j];
  25.                                 a[j]=a[j+1];
  26.                                 a[j+1]=a2;
  27.                                 a2=b[j];
  28.                                 b[j]=b[j+1];
  29.                                 b[j+1]=a2;
  30.                                 a2=c[j];
  31.                                 c[j]=c[j+1];
  32.                                 c[j+1]=a2;
  33.                         }
  34.                         else if(a[j]==a[j+1])
  35.                         {
  36.                                 if(b[j]<b[j+1])
  37.                                 {
  38.                                     a2=b[j];
  39.                                     b[j]=b[j+1];
  40.                                     b[j+1]=a2;
  41.                                     a2=c[j];
  42.                                     c[j]=c[j+1];
  43.                                     c[j+1]=a2;
  44.                                 }
  45.                                 else if(b[j]==b[j+1])
  46.                                 {
  47.                                         if(c[j]>c[j+1])
  48.                                         {
  49.                                                 a2=c[j];
  50.                                         c[j]=c[j+1];
  51.                                             c[j+1]=a2;
  52.                                         }
  53.                                 }
  54.                         }
  55.                 }
  56.         }
  57.         for(i=1;i<=5;i++)
  58.         {
  59.                 printf("%d %d\n",c[i],a[i]);
  60.         }
  61.     return 0;
  62. }
复制代码
回复 支持 反对

使用道具 举报

50

主题

215

帖子

619

积分

高级会员

Rank: 4

积分
619
6#
发表于 2018-7-30 14:18:44 | 只看该作者
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int n;
  5. struct grade
  6. {
  7.         int chinese,math,english,sum,num;
  8. }a[10000];
  9. bool cmp1(grade x,grade y)
  10. {
  11.         return x.sum>y.sum;
  12. }
  13. bool cmp2(grade x,grade y)
  14. {
  15.         return x.chinese>y.chinese;
  16. }
  17. bool cmp3(grade x,grade y)
  18. {
  19.         return x.num<y.num;
  20. }
  21. int main()
  22. {
  23.         cin>>n;
  24.         for(int i=1;i<=n;i++)
  25.         {
  26.             cin>>a[i].chinese>>a[i].math>>a[i].english;
  27.             a[i].num=i;
  28.             a[i].sum=a[i].chinese+a[i].math+a[i].english;
  29.         }
  30.         sort(a+1,a+1+n,cmp1);
  31. /*        cout<<endl;
  32.         for(int i=1;i<=10;i++)
  33.         cout<<a[i].num<<" "<<a[i].sum<<" "<<a[i].chinese<<endl;
  34.         cout<<endl;*/
  35.         for(int i=1;i<=10;i++)
  36.         {
  37.                 int j=1;
  38.                 while(a[i].sum==a[i+j].sum)j++;
  39.                 sort(a+i,a+i+j,cmp2);
  40.         ///        for(int u=i;u<i+j;u++)
  41.         ///        cout<<a[u].num<<" "<<a[u].sum<<" "<<a[u].chinese<<endl;
  42.                 int k=1;
  43.                 while(a[i].chinese==a[i+k].chinese && k<j)k++;
  44.                 sort(a+i,a+i+k,cmp3);
  45.         }
  46.         for(int i=1;i<=5;i++)
  47.         cout<<a[i].num<<" "<<a[i].sum<<endl;
  48.         return 0;
  49. }
复制代码
回复 支持 反对

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
7#
发表于 2018-8-24 22:10:00 | 只看该作者
大家都写得好长
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int n,i,t1,t2,t3,tt,j;
  5. struct student
  6. {
  7.     int ch,num,total;
  8.     bool operator<(const student & c) const
  9.     {return total==c.total?(ch==c.ch?(num<c.num):(ch>c.ch)):(total>c.total);}
  10.     ///根据题目要求自定义比较函数
  11. }s[310];
  12. int main()
  13. {
  14.     cin>>n;
  15.     for(i=0;i<n;i++)
  16.     {
  17.         cin>>t1>>t2>>t3;tt=t1+t2+t3;
  18.         s[i].ch=t1;
  19.         s[i].total=tt;
  20.         s[i].num=i+1;
  21.     }
  22.     sort(s,s+n);
  23.     for(i=0;i<=4;i++)
  24.         cout<<s[i].num<<' '<<s[i].total<<endl;
  25.     return 0;
  26. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-26 02:08 , Processed in 0.395721 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表