
一开始的思路是将货仓的位置取在所有仓库的平均数的位置,但是并不对,应该把位置设置在最中间的商店的位置,这样就可以少走一家商店
举个例子:1 6 8
如果用取平均位置的方法那么货仓位置应该是5
所以ans(距离和) = 4 + 1 + 3 = 8;
如果用另外一种方法那么货仓的位置应该是6
所以ans = 5 + 2 = 7;
很显然第二种方法最短
于是我想到了通过sort排序后找商店中的中间值来作为仓库选址
那么得先判断N是奇数还是偶数
如果是偶数的话,中间值取哪一个都可以
如果是奇数的话,中间值必须取N/2+1
于是我写了下面的代码,无奈最后一个测试点怎么也过不了
#include <iostream>
#include<algorithm>
using namespace std;
long long N, a[1000000], ans;
int main()
{
cin >> N;
for (int i = 1; i <= N; i++)
{
cin >> a[i];
}
sort(a, a + N);
if (N % 2 == 0)
{
for (int i = 1; i <= N; i++)
{
if (a[i] > a[N / 2])
{
ans += a[i] - a[N / 2];
}
else
{
ans += a[N / 2] - a[i];
}
}
}
else
{
for (int i = 1; i <= N; i++)
{
if (a[i] > a[N / 2 + 1])
{
ans += a[i] - a[N / 2 + 1];
}
else
{
ans += a[N / 2 + 1] - a[i];
}
}
}
cout << ans;
return 0;
}
我就只能换了一种写法,上面的为什么没有ac至今还是个未解之谜
#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long N, a[1000000], sum, ans;
int main()
{
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> a[i];;
}
sort(a, a + N);
sum = a[N / 2];
for (int i = 0; i < N; i++)
ans += abs(sum - a[i]);//计算到每家商店的距离之和
cout << ans;
return 0;
}