结构体排序

1.排名之一

班上刚测试了几门课,现在信息技术老师要分析一些功课之间的成绩关系,看看每个人的信息技术课排名以及他的 数学排名,并按信息技术课的成绩从高分到低分排列(数据中保证任意一学科中没有两个人的这门课成绩是一样的 )。老师把任务交给了信息学最好的你,请你编程完成这个任务。

Format

Input

第一行一个整数N,表示共有N个同学的成绩。 后面有N行,每行4个整数,分别表示一个同学的:语文、数学、英语、信息技术成绩。

Output

共N行,每行6个数据,分别对应一个同学的:语文、数学、英语、信息技术成绩和信息技术及数学的排名。

思路:用两个结构体排序函数就行了

CODE:

#include <bits/stdc++.h>
using namespace std;
struct stu {
    int math, chinese, it, english, s1, s2;
};
bool cmp1(stu a, stu b) {//结构体排序
    return a.math > b.math;
}
bool cmp2(stu a, stu b) {
    return a.it > b.it;
}
stu a[100001];
int main() {
    int n;
    cin >> n;

    for (int i = 1; i <= n; i++) {
        cin >> a[i].chinese >> a[i].math >> a[i].english >> a[i].it;
    }

    sort(a + 1, a + n + 1, cmp1);

    for (int i = 1; i <= n; i++) {
        a[i].s1 = i;
    }

    sort(a + 1, a + n + 1, cmp2);

    for (int i = 1; i <= n; i++) {
        a[i].s2 = i;
    }

    for (int i = 1; i <= n; i++) {
        cout << a[i].chinese << " " << a[i].math << " " << a[i].english << " " << a[i].it << " " << a[i].s2 << " " <<
             a[i].s1 << endl;
    }

    return 0;
}

2.排名之二

某次比赛后,老师们批出了所有学生的成绩,成绩按分数从高到低排名,成 绩相同按年级从低到高排(注:纯属虚构,请勿对号入座)。现在主办单位想知道每一个排名的学生前,有几位学生的年级低于他(她)。

Format

Input

有若干行: 第1行只有一个正整数n(1≤n≤200),表示参赛的学生人数。 第2行至第n+1行共n行,每行有两个正整数s(0≤s≤400),g(1≤g≤6)。 其中第i+1行的第一个数s表示第i个学生的成绩,第i+1行的第二个数g表示第i个学生的年级。

Output

有n行,每行只有一个正整数 其中第i行的数k表示排第i名的学生前面有k个学生排名比他(她)高,且年级比他(她)低。

思路:用多关键字排序

CODE:

#include<bits/stdc++.h>
using namespace std;
struct abc {
	int cj,nj;
} a[210];
bool cmp(abc a,abc b) {
	if(a.cj==b.cj)
		return a.nj<b.nj;
	else
		return a.cj>b.cj;
}
int main() {
	int n;
	cin>>n;
	for(int i=1; i<=n; i++)
		cin>>a[i].cj>>a[i].nj;
	sort(a+1,a+1+n,cmp);
	for(int i=1; i<=n; i++) {
		int ans=0;
		for(int j=1; j<i; j++)//经过排序后,在i前面的均是成绩高于i的
			if(a[i].nj>a[j].nj)
				ans++;
		cout<<ans<<endl;
	}
	return 0;
}

3.排名之三

高三全省联合模拟考试刚刚结束,经过各科老师的努力,各个学科的改卷工作终于结束了,每位同学的各科分数也 已经结算完毕。此时,老师们开始模拟各个高校录取情况。每个大学有自己的录取范围。例如,清华、北大招生约 为理科全省前100名,复旦、上海交大在全省理科101至300名。老师们想要知道哪些同学可以进入某个名校。可是 ,统计软件突然失灵,查询和比对工作也无法进行,只有事先已经得到的理科每位同学的各科成绩。现在请你帮助 老师编写一个程序,显示出可以进入某高校的名单。此次考试理科排名规则: 1.按照语文、数学、外语、理科综合四门科目总分由高到低排名; 2.若总分相同,则按照数学成绩由高到低排名; 3.若总分和数学成绩都相同,按照理科综合成绩由高到低排名; 4.若总分、数学、理科综合都相同,按照语文成绩由高到低排名; 5.若总分、数学、理科综合、语文成绩都相同,则按照报名序号从小到大排序 (这里报名序号为输入顺序,第1个 输入就是1号,第100个输入就是100号)。

Format

Input

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

Output

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

样例输入 
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
样例输出 
2 660
4 639
6 636
//【样例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名的序号和总分

思路:还是用多关键字排序,只不过不止两个了

CODE:

#include <bits/stdc++.h>
using namespace std;
struct stu {
    int chinese, math, english, li, zong, xu;
} aa[111001];
bool cmp(stu x, stu y) {//多关键字排序
    if (x.zong == y.zong) {
        if (x.math == y.math) {
            if (x.li == y.li) {
                if (x.chinese == y.chinese) {
                    return x.xu < y.xu;
                } else
                    return x.chinese > y.chinese;
            } else
                return x.li > y.li;
        } else
            return x.math > y.math;
    } else
        return x.zong > y.zong;
}
int main() {
    int n, a, b;
    cin >> n >> a >> b;

    for (int i = 1; i <= n; i++) {
        cin >> aa[i].chinese >> aa[i].math >> aa[i].english >> aa[i].li;
        aa[i].xu = i;
        aa[i].zong = aa[i].chinese + aa[i].math + aa[i].english + aa[i].li;
    }

    sort(aa + 1, aa + n + 1, cmp);

    for (int i = a; i <= b; i++)
        cout << aa[i].xu << " " << aa[i].zong << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值