用结构体排序也能做,只是稍微麻烦一些,对每种排名方式均要进行一次排序
#include <iostream>
#include<algorithm>
#include<malloc.h>
using namespace std;
struct list {
	int gold, all, number;//金牌数,奖牌数和人口数
	int l1, l2, l3, l4;//对应四种排名方式
	int order;//原来的输入顺序,方便在排序完后回归原来的顺序
};
//四种排名方式sort函数所对应要用的compare函数
bool compare1(list x, list y) {
	return x.gold > y.gold;
}
bool compare2(list x, list y) {
	return x.all > y.all;
}
bool compare3(list x, list y) {
	return 1.0*x.gold / x.number > 1.0*y.gold / y.number;
}
bool compare4(list x, list y) {
	return 1.0*x.all / x.number > 1.0*y.all / y.number;
}
//回归原来输入顺序的函数
bool compare5(list x, list y) {
	return x.order < y.order;
}
int main() {
	int n;
	int m;
	cin >> n >> m;//n是国家数,m是排名的国家数
	list* arr = (list*)malloc(sizeof(list) * n);
	int* country = (int*)malloc(sizeof(int) * m);
	for (int i = 0; i < n; i++) {
		cin >> arr[i].gold >> arr[i].all >> arr[i].number;
		arr[i].order = i;
	}
	for (int i = 0; i < m; i++)cin >> country[i];
	sort(arr, arr + n, compare1);//对金牌数进行排序
	arr[0].l1 = 1;
	for (int i = 1; i < n; i++) {
		if (arr[i].gold == arr[i - 1].gold)arr[i].l1 = arr[i - 1].l1;
		else arr[i].l1 = i + 1;
	}//排名记录在l1中
	sort(arr, arr + n, compare2);//对奖牌数进行排序
	arr[0].l2 = 1;
	for (int i = 1; i < n; i++) {
		if (arr[i].all == arr[i - 1].all)arr[i].l2 = arr[i - 1].l2;
		else arr[i].l2 = i + 1;
	}//排名记录在l2中
	sort(arr, arr + n, compare3); arr[0].l3 = 1;//对金牌人口比例进行排序
	for (int i = 1; i < n; i++) {
		if (1.0*arr[i].gold / arr[i].number == 1.0*arr[i - 1].gold / arr[i - 1].number)arr[i].l3 = arr[i - 1].l3;
		else arr[i].l3 = i + 1;
	}//排名记录在l3中
	sort(arr, arr + n, compare4);//对奖牌人口比例进行排序
	arr[0].l4 = 1;
	for (int i = 1; i < n; i++) {
		if (1.0*arr[i].all / arr[i].number == 1.0*arr[i - 1].all / arr[i - 1].number)arr[i].l4 = arr[i - 1].l4;
		else arr[i].l4 = i + 1;
	}//排名记录在l4中
	sort(arr, arr + n, compare5);//回归原来的排序顺序
	for (int i = 0; i < m; i++) {
		if (arr[country[i]].l1 <= arr[country[i]].l2 && arr[country[i]].l1 <= arr[country[i]].l3 && arr[country[i]].l1 <= arr[country[i]].l4)
			cout << arr[country[i]].l1 << ':' << 1 << endl;
		else if (arr[country[i]].l2 <= arr[country[i]].l1 && arr[country[i]].l2 <= arr[country[i]].l3 && arr[country[i]].l2 <= arr[country[i]].l4)
			cout << arr[country[i]].l2 << ':' << 2 << endl;
		else if (arr[country[i]].l3 <= arr[country[i]].l1 && arr[country[i]].l3 <= arr[country[i]].l2 && arr[country[i]].l3 <= arr[country[i]].l4)
			cout << arr[country[i]].l3 << ':' << 3 << endl;
		else cout << arr[country[i]].l4 << ':' << 4 << endl;
	}//对需要排序的国家,输出四种排名方式中最小的一个
	return 0;
}