数据结构与算法题目集7-40——奥运排行榜

我的数据结构与算法题目集代码仓:https://github.com/617076674/Data-structure-and-algorithm-topic-set

原题链接:https://pintia.cn/problem-sets/15/problems/867

题目描述:

数据结构与算法题目集7-40——奥运排行榜

知识点:排序

思路:分别按4个规则排序4次

注意排名相同的情况,即如果某两个国家的金牌数都是10,那么其金牌排名应当相同

时间复杂度是O(N*M)。空间复杂度是是O(N)。

C++代码:

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;

struct country {
	int number;	//国家编号
	int prizes[3];	//prizes[0]代表金牌数量,prizes[1]代表奖牌数量,prizes[2]代表国民人口数量
	int rank;
};

int N, M;
//countries1按金牌排名,countries2按奖牌排名,countries3按国民人均金牌排名,countries4按人均奖牌排名
vector<country> countries1, countries2, countries3, countries4;

bool cmp1(country c1, country c2);
bool cmp2(country c1, country c2);
bool cmp3(country c1, country c2);
bool cmp4(country c1, country c2);
void generateRank(int condition);
int findRank(int condition, int number);

int main() {
	scanf("%d %d", &N, &M);
	for(int i = 0; i < N; i++) {
		country tempCountry;
		scanf("%d %d %d", &tempCountry.prizes[0], &tempCountry.prizes[1], &tempCountry.prizes[2]);
		tempCountry.number = i;
		countries1.push_back(tempCountry);
		countries2.push_back(tempCountry);
		countries3.push_back(tempCountry);
		countries4.push_back(tempCountry);
	}
	sort(countries1.begin(), countries1.end(), cmp1);
	sort(countries2.begin(), countries2.end(), cmp2);
	sort(countries3.begin(), countries3.end(), cmp3);
	sort(countries4.begin(), countries4.end(), cmp4);
	for(int i = 0; i < 4; i++){
		generateRank(i);
	}
	for(int i = 0; i < M; i++) {
		int query;
		scanf("%d", &query);
		int ranks[4];
		for(int j = 0; j < 4; j++) {
			ranks[j] = findRank(j + 1, query);
		}
		int minIndex = 0;
		for(int j = 1; j < 4; j++) {
			if(ranks[j] < ranks[minIndex]) {
				minIndex = j;
			}
		}
		printf("%d:%d", ranks[minIndex], minIndex + 1);
		if(i == M - 1) {
			printf("\n");
		} else {
			printf(" ");
		}
	}
	return 0;
}

bool cmp1(country c1, country c2) {
	return c1.prizes[0] > c2.prizes[0];
}

bool cmp2(country c1, country c2) {
	return c1.prizes[1] > c2.prizes[1];
}

bool cmp3(country c1, country c2) {
	return c1.prizes[0] * 1.0 / c1.prizes[2] > c2.prizes[0] * 1.0 / c2.prizes[2];
}

bool cmp4(country c1, country c2) {
	return c1.prizes[1] * 1.0 / c1.prizes[2] > c2.prizes[1] * 1.0 / c2.prizes[2];
}

void generateRank(int condition) {
	if(condition == 0) {
		for(int i = 0; i < countries1.size(); i++) {
			if(i > 0 && countries1[i].prizes[0] == countries1[i - 1].prizes[0]) {
				countries1[i].rank = countries1[i - 1].rank;
			} else {
				countries1[i].rank = i;
			}
		}
	} else if(condition == 1) {
		for(int i = 0; i < countries2.size(); i++) {
			if(i > 0 && countries2[i].prizes[1] == countries2[i - 1].prizes[1]) {
				countries2[i].rank = countries2[i - 1].rank;
			} else {
				countries2[i].rank = i;
			}
		}
	} else if(condition == 2) {
		for(int i = 0; i < countries3.size(); i++) {
			if(i > 0 && countries3[i].prizes[0] * 1.0 / countries3[i].prizes[2] == countries3[i - 1].prizes[0] * 1.0 / countries3[i - 1].prizes[2]) {
				countries3[i].rank = countries3[i - 1].rank;
			} else {
				countries3[i].rank = i;
			}
		}
	} else {
		for(int i = 0; i < countries4.size(); i++) {
			if(i > 0 && countries4[i].prizes[0] * 1.0 / countries4[i].prizes[2] == countries4[i - 1].prizes[0] * 1.0 / countries4[i - 1].prizes[2]) {
				countries4[i].rank = countries4[i - 1].rank;
			} else {
				countries4[i].rank = i;
			}
		}
	}
}

int findRank(int condition, int number) {
	if(condition == 1) {
		for(int i = 0; i < countries1.size(); i++) {
			if(number == countries1[i].number) {
				return countries1[i].rank + 1;
			}
		}
	} else if(condition == 2) {
		for(int i = 0; i < countries2.size(); i++) {
			if(number == countries2[i].number) {
				return countries2[i].rank + 1;
			}
		}
	} else if(condition == 3) {
		for(int i = 0; i < countries3.size(); i++) {
			if(number == countries3[i].number) {
				return countries3[i].rank + 1;
			}
		}
	} else {
		for(int i = 0; i < countries4.size(); i++) {
			if(number == countries4[i].number) {
				return countries4[i].rank + 1;
			}
		}
	}
}

C++解题报告:

数据结构与算法题目集7-40——奥运排行榜