描述
你决定写一本介绍好餐馆的书。您想介绍的餐厅有N家:餐厅1、餐厅2、餐厅...、餐厅N。餐厅i位于城市Si,在100分制中,您对该餐厅的评估分数为Pi。没有两家餐厅的得分相同。
您希望按照以下顺序介绍这些餐厅:
- 餐厅按其城市名称的词典顺序排列。
- 如果同一城市有多家餐厅,则按得分降序排列。
按照书中介绍的顺序打印餐厅的标识号。
输入描述
N
S1 P1
:
SN PN
输出描述
打印 N 行。第i(1≤i≤N)行应包含书中介绍的第i(i)家餐厅的标识号。
用例输入 1
6 khabarovsk 20 moscow 10 kazan 50 kazan 35 moscow 60 khabarovsk 40
用例输出 1
3 4 6 1 5 2
提示
限制因素
- 1≤N≤100
- S 是长度在 1 和 10 之间(含)的字符串,由小写英文字母组成。
- 0≤Pi≤100
- Pi 为整数。
- Pi=Pj (1 ≤ i < j ≤ N)
代码:
#include<bits/stdc++.h> // 包含了大部分标准库,使得编程时无需频繁地包含头文件
using namespace std; // 使用标准命名空间
const int N = 10007; // 定义常量N,表示餐厅的最大数量
int n; // 餐厅的数量
struct f // 定义结构体f,用于存储餐厅的信息
{
string s; // 餐厅所在城市的名称
int p; // 餐厅的评估分数
int h; // 餐厅的标识号
}a[N]; // 声明结构体数组a,用于存储所有餐厅的信息
bool cmp(f x, f y) // 定义比较函数cmp,用于sort函数中的排序规则
{
if((x.s > y.s) || (x.p < y.p && x.s == y.s)) return 0; // 如果x的城市名称大于y的,或者x和y城市相同但x的分数小于y的,则返回0,表示x应该排在y之后
else return 1; // 否则返回1,表示x应该排在y之前
}
int main() // 主函数
{
cin >> n; // 输入餐厅的数量
for(int i = 1; i <= n; i++) // 循环读取每个餐厅的信息
{
cin >> a[i].s >> a[i].p; // 输入餐厅的城市名称和评估分数
a[i].h = i; // 设置餐厅的标识号为当前循环的索引i
}
sort(a + 1, a + n + 1, cmp); // 对结构体数组进行排序,从a[1]到a[n]
for(int i = 1; i <= n; i++) cout << a[i].h << endl; // 循环输出排序后餐厅的标识号
return 0; // 程序正常结束
}
解析
这段代码的主要目的是编写一个程序,该程序能够按照特定的排序规则对一组餐厅进行排序,并最终输出排序后餐厅的标识号。程序使用了C++编程语言,并且使用了STL库中的sort
函数来进行排序。
变量和结构体定义
-
N
:定义了一个常量,表示餐厅的最大数量。 -
n
:存储了实际输入的餐厅数量。 -
struct f
:定义了一个结构体,用来存储每个餐厅的信息。其中:-
s
:存储餐厅所在城市的名称。 -
p
:存储餐厅的评估分数。 -
h
:存储餐厅的标识号。
-
-
a[N]
:是一个结构体数组,用来存储所有餐厅的信息。
函数定义
-
bool cmp(f x, f y)
:定义了一个比较函数,用于sort
函数中的排序规则。该函数比较两个餐厅的结构体,返回比较结果。
主函数 main
- 读取餐厅数量
n
。 - 使用循环读取每个餐厅的城市名称
s
和评估分数p
,并将当前循环的索引i
赋值给a[i].h
作为餐厅的标识号。 - 使用
sort
函数对结构体数组a
进行排序,排序规则由比较函数cmp
定义。 - 使用循环输出排序后餐厅的标识号。
比较函数 cmp
的细节
-
cmp
函数首先比较两个餐厅所在城市的名称s
。如果x.s
大于y.s
(即按照词典顺序x
在y
之后),则cmp
返回0
,表示x
应该排在y
之后。 - 如果城市名称相同,则比较两个餐厅的评估分数
p
。如果x.p
小于y.p
,则cmp
仍然返回0
,表示在相同城市的情况下,分数较低的餐厅应该排在分数较高的餐厅之后。 - 如果以上两个条件都不满足,则
cmp
返回1
,表示x
应该排在y.s
之前。
存在的问题
在 sort
函数调用时,传递的参数范围有误。应该是从 a
到 a + n
,而不是 a + 1
到 a + n + 1
。因为C++中的数组索引是从0开始的,所以正确的调用应该是 sort(a, a + n, cmp);
。
总结
该代码的主要目的是按照城市名称的词典顺序和评估分数的降序对餐厅进行排序,并输出排序后的餐厅标识号。然而,代码中存在排序函数调用参数错误的问题,需要修正为 sort(a, a + n, cmp);
以避免访问数组越界的错误。修正后的代码可以正确执行上述功能。