中石油新生训练赛第二场 B-排队IV

题目描述

在很多场合,我们都需要排队,比如超市付款,医院看病,就餐等等。“尊老爱幼”是中华名族的传统美德,所以在排队的过程中,遇到老人、幼儿我们应该主动让他们排在前面。请按以下 4 条规则编写一个排队的程序。
(1)老人(年龄 ≥ 60 岁)和幼儿(年龄 ≤ 6 岁)比其他人(6 岁 < 年龄 < 60 岁)优先排在队伍的前面,且所有幼儿排在所有老人的前面。
(2)老人按年龄从大到小的顺序排队,年龄大的优先,年龄相同时,先到的人排在前面。
(3)幼儿按年龄从小到大的顺序排队,年龄小的优先,年龄相同时,先到的人排在前面。
(4)其他人只按到达的先后顺序排队。

输入

输入共n+1行。
第1行一个整数n,表示排队的总人数。
第2行到第n+1行,按照到达的先后顺序给出了每个人的基本信息。每行两个整数,第一个整数表示这个人的编号(编号保证不会重复,但不保证连续),第二个整数表示这个人的年龄。

输出

输出共n行。
每行一个人的编号,表示从前往后的排队结果。

样例输入
复制样例数据 8
1 14
3 6
4 5
5 62
11 48
17 25
21 60
13 62

样例输出
4
3
5
13
21
1
11
17

提示
共有8个人参加排队。编号为3和4的两个人为幼儿,年龄分别为6岁和5岁。编号为5、21和13的三个人为老人,年龄分别为62岁、60岁和62岁。根据排队规则,老人和幼儿排在其他人的前面,而幼儿又排在老人的前面,所以先排编号3和4的幼儿。幼儿按年龄从小到大的顺序排队,所以第一个人是4号,然后是3号。接下来排老人,老人年龄大的先排,所以先排5号和13号,但5号比13号先到,所以先排5号,然后13号,接下来21号。剩下的人不论年龄大小,全部按到达的顺序排队,依次为1号、11号和17号。

【数据范围约定】
40%的测试点输入数据保证1≤n≤99,且每个人的年龄都不相同。
60%的测试点输入数据保证1≤n≤1000。
100%的测试点输入数据保证1≤n≤30000,1≤人的编号≤32000,2≤人的年龄≤100。

我相信这个题每个人都能想出思路来,但是可能提交会发现超时,知道是排序的问题,也知道基本的快排怎么用,但发出这样的疑问:我怎么让快排按照我自己的规则排序呢?
这要靠sort函数的第三个参数,一个函数,用来控制排序时遵循的规则。一般写成compare(cmp),其实这个内部的联系我也不是很懂,毕竟也没看过sort函数的源代码是怎样的,但对于我们来说只需要学会怎么去写cmp这个函数就可以了。

我抽象的理解就是在一定条件下,return a()<b() or return a()>b()
前提是(** a,**b) ,如果return 第一个 就是a,b从小到大,如返回第二个就是a,b从大到小 ,a,b括号中或许是他的名字,比如a.time<b.time 就是按照时间从小到大排列,同时结构体中其他的量随着时间的变化而变化。
原谅我话拙。。。不懂继续百度(Google)吧

#include <cstdio>
#include <algorithm>
using namespace std;
typedef struct people{
	int time;
	int age;
	int num;
};
int cmp(people a,people b)
{
	if(a.age<60&&a.age>6&&b.age<60&&b.age>6)
		return a.time<b.time;
	else if(a.age<=6&&b.age<=6)
	{
		if(a.age==b.age)
			return a.time<b.time;
		else
			return a.age<b.age;
	}
	else if(a.age>=60&&b.age>=60)
	{
		if(a.age==b.age)
			return a.time<b.time;
		else
			return a.age>b.age;
	}
	else if(a.age<=6||b.age<=6)
		return a.age<b.age;
	else 
		return a.age>b.age;
}
int main()
{
	int n;
	people a[30000];
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d %d",&a[i].num,&a[i].age);
		a[i].time=i;
	}
	sort(a,a+n,cmp);
	for(int i=0;i<n;i++)
	printf("%d\n",a[i].num);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_43332389/article/details/84995410