如题,两组数关系不可打乱,且要达到排序要求
问题来源: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); //结构体需自定义排序类型,不然我猜测会报错
}