1.题目
问题描述
小F是A市的市长,正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整,形成网格状。从一个位置[x1, y1]到另一个位置[x2, y2]的距离计算方法为 |x1 - x2| + |y1 - y2|,即曼哈顿距离。
在初步考察后,市政府列出了M个可能的火车站建设点。为了使得市民到火车站的总旅行时间最短,小F希望选出一个最优位置作为火车站的地址。
请你帮助小F计算出哪一个位置最适合建设新火车站。
N: 市民的总人数。M: 可建设火车站的备选位置数。citizens: 一个列表,每个元素是一个元组[x_i, y_i],表示第i位市民的居住位置。locations: 一个列表,每个元素是一个元组[p_i, q_i],表示第i个备选的火车站位置。
如果有多个火车站最优,那么选择第一次出现的那个。
测试样例
样例1:
输入:n = 4,m = 3,citizens = [[-1, -1], [-1, 1], [1, -1], [1, 1]],locations = [[3, 2], [1, 0], [0, 0]]
输出:
[1, 0]
样例2:
输入:n = 2,m = 2,citizens = [[0, 0], [0, 4]],locations = [[0, 2], [0, 3]]
输出:
[0, 2]
样例3:
输入:n = 3,m = 1,citizens = [[10, 10], [20, 20], [30, 30]],locations = [[15, 15]]
输出:
[15, 15]
样例4:
输入:n = 5,m = 3,citizens = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]],locations = [[4, 5], [6, 7], [8, 9]]
输出:
[4, 5]
样例5:
输入:n = 6,m = 2,citizens = [[10, 10], [20, 20], [30, 30], [40, 40], [50, 50], [60, 60]],locations = [[35, 35], [45, 45]]
输出:
[35, 35]
2.思路
穷举,找到市民到火车站的总旅行时间最短的火车站
3.代码
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
std::vector<int> solution(int n, int m, std::vector<std::vector<int>> citizens, std::vector<std::vector<int>> locations) {
// Please write your code here
// 遍历每个火车站
int min_total_distance = 9999;
vector<int> result;
for (int i = 0; i < m; i++){
int sum_distance = 0;
for (int j = 0; j < m; j++){
sum_distance += abs(locations[i][0] - citizens[j][0]) + abs(locations[i][1] - citizens[j][1]);
}
if (sum_distance < min_total_distance){
result = locations[i];
}
}
return result;
}
bool vectorEqual(std::vector<int> a, std::vector<int> b) {
if (a.size()!= b.size()) {
return false;
}
for (size_t i = 0; i < a.size(); ++i) {
if (a[i]!= b[i]) {
return false;
}
}
return true;
}
int main() {
// You can add more test cases here
std::vector<std::vector<int>> citizens1 = {{-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
std::vector<std::vector<int>> locations1 = {{3, 2}, {1, 0}, {0, 0}};
std::vector<int> result = solution(4, 3, citizens1, locations1);
for (int i = 0; i < result.size(); ++i) {
std::cout << result[i] << " ";
}
std::cout << std::endl;
std::cout << (vectorEqual(result, {1, 0}) ) << std::endl;
return 0;
}
结果错误,是{0,0}
- 内循环将m改成n
- 在每次找到更小的总距离时,更新
min_total_distance
#include <cstdlib>
#include <iostream>
#include <vector>
using namespace std;
std::vector<int> solution(int n, int m, std::vector<std::vector<int>> citizens, std::vector<std::vector<int>> locations) {
// Please write your code here
// 遍历每个火车站
int min_total_distance = 9999;
vector<int> result;
for (int i = 0; i < m; i++){
int sum_distance = 0;
for (int j = 0; j < n; j++){
sum_distance += abs(locations[i][0] - citizens[j][0]) + abs(locations[i][1] - citizens[j][1]);
}
if (sum_distance < min_total_distance){
result = locations[i];
min_total_distance = sum_distance;
}
}
return result;
}
bool vectorEqual(std::vector<int> a, std::vector<int> b) {
if (a.size()!= b.size()) {
return false;
}
for (size_t i = 0; i < a.size(); ++i) {
if (a[i]!= b[i]) {
return false;
}
}
return true;
}
int main() {
// You can add more test cases here
std::vector<std::vector<int>> citizens1 = {{-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
std::vector<std::vector<int>> locations1 = {{3, 2}, {1, 0}, {0, 0}};
std::vector<int> result = solution(4, 3, citizens1, locations1);
for (int i = 0; i < result.size(); ++i) {
std::cout << result[i] << " ";
}
std::cout << std::endl;
std::cout << (vectorEqual(result, {1, 0}) ) << std::endl;
return 0;
}