高校录取(结构体)

35 篇文章 0 订阅
3 篇文章 0 订阅

题目描述

    高三全省联合模拟考试刚刚结束,经过各科老师的努力,各个学科的改卷工作终于结束了,每位同学的各科分数也已经结算完毕。此时,老师们开始模拟各个高校录取情况。

    每个大学有自己的录取范围。例如,清华、北大招生约为理科全省前100名,复旦、上海交大在全省理科101至300名。老师们想要知道哪些同学可以进入某个名校。

    可是,统计软件突然失灵,查询和比对工作也无法进行,只有事先已经得到的理科每位同学的各科成绩。现在请你帮助老师编写一个程序,显示出可以进入某高校的名单。

    此次考试理科排名规则:
1. 按照语文、数学、外语、理科综合四门科目总分由高到低排名;
2. 若总分相同,则按照数学成绩由高到低排名;
3. 若总分和数学成绩都相同,按照理科综合成绩由高到低排名;
4. 若总分、数学、理科综合都相同,按照语文成绩由高到低排名;
5. 若总分、数学、理科综合、语文成绩都相同,则按照报名序号从小到大排序(这里报名序号为输入顺序,第1个输入就是1号,第100个输入就是100号)。

输入输出格式

输入

第一行三个整数n,a和b,分别表示参加考试的人数和某高校的录取名次范围(从名次a到名次b)。
接下来n行,每行4个整数,表示每位同学的每门学科的成绩。依次为语文、数学、英语、综合。成绩0<=x<=300。

输出

输出b-a+1行,排名在a~b名的同学信息。
每行两个整数,分别为报名序号和总分(报名序号看题目描述),中间用空格分开。

样例

输入1

6 3 5
118 139 130 286
105 130 129 296
113 138 123 291
104 133 119 283
89 139 116 287
103 127 118 288

Copy

输出1

2 660
4 639
6 636

Copy

输入2

7 3 5 
118 139 130 286 
105 130 129 296 
113 138 123 291 
105 130 129 296 
89 139 116 287 
107 127 116 286 
103 127 118 288 

Copy

输出2

2 660 
4 660 
7 636 

Copy

时间及空间限制

1s, 256MB.

提示

【样例1解释】
排序后由高到低
序号 总分
1 118 139 130 286 673
3 113 138 123 291 665
2 105 130 129 296 660
4 104 133 119 283 639
6 103 127 118 288 636
5 89 139 116 287 631
输出3~5名的序号和总分

【样例2解释】
排序后由高到低
序号 总分
1 118 139 130 286 673
3 113 138 123 291 665
2 105 130 129 296 660
4 105 130 129 296 660
7 103 127 118 288 636
6 107 127 116 286 636
5 89 139 116 287 631
7号和6号同为636分,数学分数又相同,理科综合分数7号较高,因此排在6号前面。
2号和4号所有成绩都相同,只能按照序号排序,2号在4号之前

【数据范围】
对于40%的数据,1<=a<=b<=n<=100,且保证每个人的总分都不相同。
对于70%的数据,1<=a<=b<=n<=300。
对于100%的数据,1<=a<=b<=n<=100000。

参考代码:


#include<bits/stdc++.h>
using namespace std;
struct chengji
{
	int yw,sx,yy,lz,zf,xh;
}a[100005];
bool cmp(chengji s1,chengji s2)
{
	if(s1.zf!=s2.zf)
	{
		return s1.zf > s2.zf; 
	}
	if(s1.sx!=s2.sx)
	{
		return s1.sx>s2.sx;
	}
	if(s1.lz!=s2.lz)
	{
		return s1.lz > s2.lz;		
	}
	if(s1.yw != s2.yw)
	{
		return s1.yw > s2.yw ;
	}
	return s1.xh<s2.xh;
}
int main()
{
	int n,x,y,i;
	cin >> n>> x >> y;
	for(i=1;i<=n;i++)
	{
		cin >> a[i].yw >> a[i].sx>> a[i].yy >> a[i].lz;
		a[i].zf= a[i].yw+a[i]. sx+a[i].yy+a[i].lz;
		a[i].xh =i;
	}
	sort(a+1 ,a+n+1, cmp);
	for(i=x;i<=y;i++)
	{
		cout << a[i].xh << " "<< a[i].zf<< endl;
	}
}

解析+代码:

#include <bits/stdc++.h>
using namespace std;
struct student
{
    float yw;//语文 
    float sx;//数学 
    float wy;//外语 
    float lz;//理综 
    float zf;//总分 
    int id;//输入的序号
};
student s[100005];//结构体数组s
bool cmp(student s1, student s2)//比较两个人的情况 
{
    if(s1.zf != s2.zf)//总分不等,则按照总分从大到小排序
        return s1.zf > s2.zf;
    else if(s1.sx!=s2.sx)//数学不等,则按照数学从大到小排序
        return s1.sx > s2.sx;
    else if(s1.lz!=s2.lz)//理综不等,则按照理综从大到小排序
        return s1.lz > s2.lz;
    else if(s1.yw!=s2.yw)//语文不等,则按照语文从大到小排序
        return s1.yw > s2.yw;
    else if(s1.id!=s2.id)
        return s1.id < s2.id;
}
int main()
{
    int n,a,b;
    cin >> n>>a>>b;
    for(int i = 1; i <= n; i++)
    {
        cin >> s[i].yw >> s[i].sx >> s[i].wy>>s[i].lz;
        s[i].zf = s[i].yw + s[i].sx+s[i].wy+s[i].lz;//输入的时候可以计算总分
        s[i].id = i;//把i当成序号记录一下
    }
    sort(s+1, s+n+1, cmp);//结构体需要自定义比较方式 
    for(int i = a; i <= b; i++)
    {
        cout<<s[i].id<<" "<<s[i].zf<<endl;//输出排名和总分 
}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值