出题人: 描述 贝壳街上有很多家住户,小丁准备在该条街上开一家商店,请问,他的商店开在哪里,可以使得所有住户到商店的距离的总和是最小的。 本题中,假设该条街是一条笔直的街道,街道的起始位置标记为0,已知每个住户离起点的距离。 本题要求的位置可以是街道中的任何一个位置,也可以和住户的位置是重叠的,请你编程求解。 输入描述 输入的第一行是一个整数T,表示有T组测试数据。 每组测试数据第一行是一个整数N(1<=N<=1000)表示在贝壳街上共有N个住户。 接下来N行,每行一个整数ai(0<=ai<=30000)表示每个住户住所的位置,所有住户住所的位置均不相同。 输出描述 对于每组输入,输出一行,包含两个整数,分别是你确定的商店位置,以及商店到所有住户住所的距离之和。 用例输入 1 2 5 0 20 40 10 30 1 20 用例输出 1 20 60 20 0 c++
时间: 2024-04-17 14:28:57 浏览: 135
首先,我们可以将住户的位置按照升序排序,这样商店的位置就只能在住户位置中的一个位置上。然后,我们可以遍历每个住户的位置,将商店的位置设置为当前住户的位置,并计算商店到所有住户住所的距离之和。找到使得距离之和最小的商店位置即可。
以下是C++的实现代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int T;
cin >> T;
while (T--) {
int N;
cin >> N;
vector<int> positions(N);
for (int i = 0; i < N; i++) {
cin >> positions[i];
}
sort(positions.begin(), positions.end());
int minDistance = INT_MAX;
int storeLocation = 0;
for (int i = 0; i < N; i++) {
int distance = 0;
for (int j = 0; j < N; j++) {
distance += abs(positions[j] - positions[i]);
}
if (distance < minDistance) {
minDistance = distance;
storeLocation = positions[i];
}
}
cout << storeLocation << " " << minDistance << endl;
}
return 0;
}
```
该代码首先读取测试数据的组数T,然后进行T次循环。在每次循环中,读取住户的位置并进行排序。然后,遍历每个住户的位置,计算商店到所有住户住所的距离之和,找到最小的距离之和及对应的商店位置,并输出结果。
对于给定的输入样例,该代码将输出:
```
20 60
20 0
```
表示商店位置分别为20,商店到所有住户住所的距离之和为60;商店位置为20,商店到所有住户住所的距离之和为0。
阅读全文