处理类型不同但关系对应的两组数(两组数按不同要求排序)

如题,两组数关系不可打乱,且要达到排序要求

问题来源:PAT1055 B组 集体照

如何让身高与姓名联系起来,排序后也不会切断二者联系?

显然,不能使用数组

原因如下:

首先,如果将二者统一在一个数组内,string与int会矛盾

其次,如果用两个数组分别处理,排序完一个后,另一个再使用for循环与排序完成的数组进行对应,那么在处理有相同数据(即本例的姓名相同情况)时,会很麻烦

可以使用结构体来处理

并通过sort函数的自定义函数来将姓名和身高同时比较

一个cmp函数,可以同时声明身高与姓名的排序规则

typedef struct stu {
	int hei;
	string name;
};
int cmp(stu a, stu b) {
	//c++中string类的优点: 可以直接比较字符串大小,不需要使用strcmp函数
	//如果a与b的hei不相等,则进入比较hei
	//如果a与b的hei相等,则进入比较name
	return a.hei != b.hei ? a.hei > b.hei : a.name < b.name;
}

int main() {
	int n, k;
	cin >> n >> k;
	stu* s = new stu[n];
	
	//如何让身高与姓名联系起来,重排序也不会切断二者联系
	//显然,不能使用数组
	//首先,如果将二者统一在一个数组内,string与int会矛盾
	//其次,如果用两个数组分别处理,排序完一个后,另一个再使用for循环与排序完成的数组进行对应,那么在处理有相同数据时,会很麻烦
	//使用结构体!!!

	for (int i = 0; i < n; i++) {
		cin >> s[i].name >> s[i].hei;
	}
	sort(s, s + n, cmp);   //结构体需自定义排序类型,不然我猜测会报错
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值