【问题描述】 在期末考试中,小 M 负责统计成绩,班级里 N 个同学分别依次告诉他自己的成 绩,小 M 需要按照次序依次告诉他们各自的排名,也就是给这些数由小到大进行 编号。如果有两个同学取得了相同的分数,则这两个同学的排名相同,且下一位 同学的排名递补。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
int a[1099];//数据
int b[1099];
int ans[1099];
map<int,int>rk;
int n;
int cnt = 0;
int main()
{
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> a[i];
}
memcpy(b,a,sizeof(a));
sort(b + 1,b + 1 + n);
for(int i = 1;i <= n;i++)
{if(rk[b[i]] == 0)// 如果没有被标记过
rk[b[i]] = ++cnt;
}
for(int i = 1;i <= n;i++)
{
ans[i] = rk[a[i]];
}
for(int i = 1;i <= n;i++)
{
cout << ans[i] << " ";
}
puts("");
return 0;
}
其实更加普遍的排名方式是比较占位,同一位置可以有多个人,但下一人的排名就不止是递增1。比如冠军两人并列的话,下一位就是季军,没有亚军。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int N;
std::cin >> N;
std::vector<std::pair<int, int>> scores; // Pair of (score, original index)
for (int i = 0; i < N; ++i) {
int score;
std::cin >> score;
scores.push_back(std::make_pair(score, i));
}
std::sort(scores.begin(), scores.end());
std::vector<int> ranks(N);
int rank = 1;
ranks[scores[0].second] = rank;
for (int i = 1; i < N; ++i) {
if (scores[i].first == scores[i - 1].first) {
ranks[scores[i].second] = rank;
}
else {
rank = i + 1;
ranks[scores[i].second] = rank;
}
}
for (int i = 0; i < N; ++i) {
std::cout << ranks[i] << " ";
}
return 0;
}