您的位置:首页 > 其它

Post Office Problem

2015-10-14 23:23 232 查看
On one line there are n houses. Give you an array of integer means the the position of each house. Now you need to pick k position to build k post office, so that the sum distance of each house to the nearest post office is the smallest. Return the least
possible sum of all distances between each village and its nearest post office.

样例

Given array a =
[1,2,3,4,5]
, k = 2.return
3
.

挑战

Could you solve this problem in
O(n^2)
time ?

class Solution {
public:
/**
* @param A an integer array
* @param k an integer
* @return an integer
*/
int postOffice(vector<int>& A, int k) {
// Write your code here
int n = A.size();
sort(A.begin(), A.end());
int cost

;
memset(cost, 0, n*n*sizeof(int));

for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
int mid = i + (j-i)/2;
cost[i][j] = 0;
for (int k = i; k <= j; k++)
{
cost[i][j] += abs(A[k] - A[mid]);
}
}
}

int buf
[k+1];
memset(buf, 0, n*(k+1)*sizeof(int));
for (int i = 0; i < n; i++)
{
for (int j = 1; j <= k; j++)
{
if (j == 1)
{
buf[i][j] = cost[0][i];
}
else if (j > i)
{
buf[i][j] = 0;
}
else
{
buf[i][j] = INT_MAX;
for (int k = 0; k < i; k++)
{
buf[i][j] = min(buf[i][j], buf[k][j-1] + cost[k+1][i]);
}
}
}
}

return buf[n-1][k];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: