两地调度
Two City Scheduling
解
贪心法:
假设让2N人全部飞往B市,然后其中N人再从B飞往A。每一个人飞往A市,就会多支付cost[i][0]-cost[i][1]
(可正可负),因此最优的方案就是让这个插值最小的N人飞往A市。
C语言没有sort,因此随便写了个归并。
int twoCitySchedCost(int** costs, int costsSize, int* costsColSize)
{
MergeSort(costs, 0, costsSize - 1);
int i, total = 0;
int n = costsSize / 2;
for (i = 0; i < n; i++){
total += costs[i][0] + costs[i + n][1];
}
*costsColSize = 2;
return total;
}
void Merge(int** a, int left, int mid, int right)
{
int len = right - left + 1;//数组长度
int **temp = (int **)malloc(len * sizeof(int *));
int k = 0;
int i = left;//前一数组起始
int j = mid + 1;//后一数组起始
for (k = 0; k < len; k++){
temp[k] = (int *)malloc(2 * sizeof(int));
}
k = 0;
while (i <= mid && j <= right){
if(a[i][0]-a[i][1] < a[j][0]-a[j][1]){
temp[k][0] = a[i][0];
temp[k][1] = a[i][1];
k++;
i++;
}else{
temp[k][0] = a[j][0];
temp[k][1] = a[j][1];
k++;
j++;
}
}
while(i <= mid){
temp[k][0] = a[i][0];
temp[k][1] = a[i][1];
k++;
i++;
}
while(j <= right){
temp[k][0] = a[j][0];
temp[k][1] = a[j][1];
k++;
j++;
}
for (k = 0; k < len; k++){
a[left][0] = temp[k][0];
a[left][1] = temp[k][1];
left++;
}
}
void MergeSort(int** a, int left, int right)
{
if (left == right){
return;
}
int mid = (left + right) / 2;
MergeSort(a, left, mid);
MergeSort(a, mid + 1, right);
Merge(a, left, mid, right);
}
结果