C++题目描述在一个二维平面上有 �N 个学生和 �M 个检查点。第 �i 1=�=�1=i=n个学生的的位置在����aibi第�j 1=�=�1=j=m 个检查点的位置在 ����c j d j 。当老师给出信号后每个学生都会跑向离他最近的检查点。在这里我们用曼哈顿距离来定义学生距离与检查点的距离。曼哈顿距离的定义是:点 �1�1x1y1 和 �2�2x2y2 的曼哈顿距离等于 ∣�1−
解题思路: 要求每个学生距离最近的检查点的编号,可以分别计算每个学生到每个检查点的曼哈顿距离,然后选择距离最小的检查点的编号。
具体步骤如下:
- 读取输入的N和M;
- 创建两个二维数组students和checkpoints,用于存储学生和检查点的坐标;
- 分别读取N行学生的坐标和M行检查点的坐标,保存到students和checkpoints数组中;
- 对于每个学生,遍历所有的检查点,计算学生到检查点的曼哈顿距离,并保存最小距离和对应的检查点编号;
- 输出每个学生选择的检查点的编号。
C++代码实现如下:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
// 存储学生和检查点的坐标
vector<vector<int>> students(N, vector<int>(2));
vector<vector<int>> checkpoints(M, vector<int>(2));
// 读取学生和检查点的坐标
for (int i = 0; i < N; i++) {
cin >> students[i][0] >> students[i][1];
}
for (int i = 0; i < M; i++) {
cin >> checkpoints[i][0] >> checkpoints[i][1];
}
// 计算每个学生选择的检查点编号
for (int i = 0; i < N; i++) {
int minDist = INT_MAX;
int minIndex = -1;
for (int j = 0; j < M; j++) {
int dist = abs(students[i][0] - checkpoints[j][0]) + abs(students[i][1] - checkpoints[j][1]);
if (dist < minDist) {
minDist = dist;
minIndex = j + 1;
}
}
cout << minIndex << endl;
}
return 0;
}
复杂度分析: 时间复杂度:O(N * M),其中N为学生数量,M为检查点数量。对于每个学生,需要遍历所有的检查点来计算距离。 空间复杂度:O(N + M),需要存储学生和检查点的坐标
原文地址: https://www.cveoy.top/t/topic/iVsF 著作权归作者所有。请勿转载和采集!