Description

题目传送门:「EPXLQ 2024」银辉描淡的石桥

排序后计算 $\text{rank}$ 后输出即可。在此之前,可以先完成此题

Analysis

  • 先来解决输出 Hahahai! 的问题。

定义变量 $flag$,先设置为都相同(true),在定义 $front$ 变量取头数据。后面输入时比较,如果发现不同的数据后,设 $flag$ 为 false

判断部分代码如下:

1
2
3
4
if(a[i].score != front)
{
flag = false;
}

  • 再来解决排序的问题。

先定义结构体,有两个参数:编号和成绩。接下来输入边输边存编号 a[i].number = i,后面写好自定义排序,定义映射类型(主打一个方便)的变量存 $\text{rank}$ 后输出即可。

存 $\text{rank}$ 的代码如下:

1
2
3
4
for(int i = 1 ; i <= n ; i ++)
{
Rank[a[i].number] = i;
}

解释一下就是 $Rank[$ 这个人的学号 $]=$ 这个人的名次($a$ 已经从大到小排过序)。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <bits/stdc++.h>
using namespace std;

struct node
{
int score;
int number;
}a[100001];

map <int , int> Rank;
bool flag = true;

bool cmp(node x , node y)
{
return x.score > y.score;
}

int main()
{
int n;
cin >> n;

cin >> a[1].score;
a[1].number = 1;
int front = a[1].score;

for(int i = 2 ; i <= n ; i ++)
{
cin >> a[i].score;
a[i].number = i;

if(a[i].score != front)
{
flag = false;
}
}

if(flag)
{
cout << "Hahahai!";
return 0;
}

sort(a + 1 , a + n + 1 , cmp);

for(int i = 1 ; i <= n ; i ++)
{
Rank[a[i].number] = i;
}

for(map <int , int> :: iterator it = Rank.begin() ; it != Rank.end() ; it ++)
{
cout << it->second << " ";
}
return 0;
}