华师一附中OI组
标题:
P1093 奖学金
[打印本页]
作者:
admin
时间:
2018-4-22 13:23
标题:
P1093 奖学金
题目描述
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前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
作者:
张笑宇
时间:
2018-4-22 18:25
#include<iostream>
#include<algorithm>
using namespace std;
int n;
const int mx=310;
int a[mx],b[mx],c[mx],sum[mx],number[mx];
int i,j;
bool cmp(int x,int y)
{
if (sum[x]<sum[y]) return 0;
else if (sum[x]>sum[y]) return 1;
else
{
if (a[x]<a[y]) return 0;
else if (a[x]>a[y]) return 1;
else return number[x]<number[y];
}
}
void change(int x,int y)
{
swap(a[x],a[y]);
swap(b[x],b[y]);
swap(c[x],c[y]);
swap(number[x],number[y]);
swap(sum[x],sum[y]);
}
int main()
{
cin>>n;
for (i=1; i<=n; i++)
{
cin>>a[i]>>b[i]>>c[i];
sum[i]=a[i]+b[i]+c[i];
number[i]=i;
}
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{
if (cmp(i,j)) change(i,j);
}
for (i=1; i<=5; i++)
cout<<number[i]<<" "<<sum[i]<<endl;
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-4-29 19:51
#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct student
{
int yuwen,shuxue,yingyu,num;
int sum;
}a[301];
int comp(student &a,student &b)
{
if(a.sum>b.sum)return 1;
if(a.sum<b.sum)return 0;
if(a.yuwen>b.yuwen)return 1;
if(a.yuwen<b.yuwen)return 0;
if(a.num<b.num)return 1;
if(a.num>b.num)return 0;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i].yuwen>>a[i].shuxue>>a[i].yingyu;
a[i].num=i;
a[i].sum=a[i].yuwen+a[i].shuxue+a[i].yingyu;
}
sort(a+1,a+n+1,comp);
for(int i=1; i<=5; i++)
cout<<a[i].num<<' '<<a[i].sum<<endl;
return 0;
}
复制代码
作者:
王令欧
时间:
2018-4-29 20:54
本帖最后由 王令欧 于 2018-4-29 20:55 编辑
#include <stdio.h>//王令欧
int main()
{
int n,i,j,t;
int num[301]={0},chinese[301]={0},maths[301]={0},english[301]={0},score[301]={0};
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&chinese[i],&maths[i],&english[i]);
num[i]=i;
score[i]=chinese[i]+maths[i]+english[i];//输入并算出总分
}
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
if(score[i]<score[j])//总分排序
{
t=num[i];
num[i]=num[j];
num[j]=t;
t=score[i];
score[i]=score[j];
score[j]=t;
}
if(score[i]==score[j])
{
if(chinese[i]<chinese[j])//语文排序
{
t=num[i];
num[i]=num[j];
num[j]=t;
t=score[i];
score[i]=score[j];
score[j]=t;
}
if(chinese[i]==chinese[j])
if(num[i]>num[j])//学号排序
{
t=num[i];
num[i]=num[j];
num[j]=t;
t=score[i];
score[i]=score[j];
score[j]=t;
}
}
}
for(i=1;i<=5;i++)
printf("%d %d\n",num[i],score[i]);//输出前5名
return 0;
}
复制代码
作者:
吴语林
时间:
2018-7-29 23:55
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int main(){
int n,i,j,a[350],b[350],c[350],a2,x,y,z;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d %d %d",&x,&y,&z);
a[i]=x+y+z;
b[i]=x;
c[i]=i;
}
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(a[j]<a[j+1])
{
a2=a[j];
a[j]=a[j+1];
a[j+1]=a2;
a2=b[j];
b[j]=b[j+1];
b[j+1]=a2;
a2=c[j];
c[j]=c[j+1];
c[j+1]=a2;
}
else if(a[j]==a[j+1])
{
if(b[j]<b[j+1])
{
a2=b[j];
b[j]=b[j+1];
b[j+1]=a2;
a2=c[j];
c[j]=c[j+1];
c[j+1]=a2;
}
else if(b[j]==b[j+1])
{
if(c[j]>c[j+1])
{
a2=c[j];
c[j]=c[j+1];
c[j+1]=a2;
}
}
}
}
}
for(i=1;i<=5;i++)
{
printf("%d %d\n",c[i],a[i]);
}
return 0;
}
复制代码
作者:
倚窗倾听风吹雨
时间:
2018-7-30 14:18
#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct grade
{
int chinese,math,english,sum,num;
}a[10000];
bool cmp1(grade x,grade y)
{
return x.sum>y.sum;
}
bool cmp2(grade x,grade y)
{
return x.chinese>y.chinese;
}
bool cmp3(grade x,grade y)
{
return x.num<y.num;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].chinese>>a[i].math>>a[i].english;
a[i].num=i;
a[i].sum=a[i].chinese+a[i].math+a[i].english;
}
sort(a+1,a+1+n,cmp1);
/* cout<<endl;
for(int i=1;i<=10;i++)
cout<<a[i].num<<" "<<a[i].sum<<" "<<a[i].chinese<<endl;
cout<<endl;*/
for(int i=1;i<=10;i++)
{
int j=1;
while(a[i].sum==a[i+j].sum)j++;
sort(a+i,a+i+j,cmp2);
/// for(int u=i;u<i+j;u++)
/// cout<<a[u].num<<" "<<a[u].sum<<" "<<a[u].chinese<<endl;
int k=1;
while(a[i].chinese==a[i+k].chinese && k<j)k++;
sort(a+i,a+i+k,cmp3);
}
for(int i=1;i<=5;i++)
cout<<a[i].num<<" "<<a[i].sum<<endl;
return 0;
}
复制代码
作者:
universehyf
时间:
2018-8-24 22:10
大家都写得好长
#include<iostream>
#include<algorithm>
using namespace std;
int n,i,t1,t2,t3,tt,j;
struct student
{
int ch,num,total;
bool operator<(const student & c) const
{return total==c.total?(ch==c.ch?(num<c.num):(ch>c.ch)):(total>c.total);}
///根据题目要求自定义比较函数
}s[310];
int main()
{
cin>>n;
for(i=0;i<n;i++)
{
cin>>t1>>t2>>t3;tt=t1+t2+t3;
s[i].ch=t1;
s[i].total=tt;
s[i].num=i+1;
}
sort(s,s+n);
for(i=0;i<=4;i++)
cout<<s[i].num<<' '<<s[i].total<<endl;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2