华为OD机试-按身高和体重排队
某学校举行运动会,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的编号顺序关系。请输出排列后的学生编号。
时间限制:限制时间C/C++ 1秒,其他/Java 2s以内
内存限制:32768K
内存限制:32768K
示例 1
输入:
4
100 100 120 130
40 30 60 50
输出:
2134
输入:
4
100 100 120 130
40 30 60 50
输出:
2134
#include <stdlib.h> #include <stdio.h> int main(void) { int n=0; scanf("%d", &n); int stu[n][2]; int ord[n]; for(int i=0; i<n; i++) ord[i]=i; for(int i=0; i<n; i++) scanf("%d", &stu[i][0]); for(int i=0; i<n; i++) scanf("%d", &stu[i][1]); for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-1-i; j++) { if (stu[ord[j]][0] > stu[ord[j+1]][0]) { // 相邻元素两两对比 int temp = ord[j+1]; // 元素交换 ord[j+1] = ord[j]; ord[j] = temp; } } } int i=0; while(i < n){ int s=i, e=i; for(int j = i+1; j < n; j++){ if(stu[ord[j]][0] == stu[ord[i]][0]){ e = j; continue; } break; } for (int i = s; i < e; i++) { for (int j = s; j < e-i; j++) { if (stu[ord[j]][1] > stu[ord[j+1]][1]) { // 相邻元素两两对比 int temp = ord[j+1]; // 元素交换 ord[j+1] = ord[j]; ord[j] = temp; } } } i = e+1; } i=0; while(i < n){ int s=i, e=i; for(int j = i+1; j < n; j++){ if(stu[ord[j]][1] == stu[ord[i]][1]){ e = j; continue; } break; } for (int i = s; i < e; i++) { for (int j = s; j < e-i; j++) { if (ord[j] > ord[j+1] ) { int temp = ord[j+1]; ord[j+1] = ord[j]; ord[j] = temp; } } } i = e+1; } for(int i=0; i<n; i++) printf("%d ", ord[i]); return 0; }