SPOJ:DCOWS为什么贪婪算法不起作用?

时间:2018-08-07 16:57:06

标签: algorithm dynamic-programming greedy

问题链接:https://www.spoj.com/problems/DCOWS/

我试图找出为什么我贪婪的方法无法解决上述问题。

给出两个列表,BC的大小分别为NM(M > N),分别由公牛和母牛的身高作为输入这个问题,我解决这个问题的方法如下:

  • 以降序排列两个列表BC
  • 设置k = 0
  • 对于list B中的每个项目 B i
    • C[k..M-N+i]上使用经过修改的二进制搜索,在0<=j<=M-Nlist C的位置{strong> j 中找到元素 C j {1}}与 B i
    • 的绝对差值最小
    • 在结果中添加abs( B i - C j
    • 为循环的下一次迭代更新k = j + 1

代码如下:

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int my_bsearch(long *arr, int lo, int hi, long x)
{
    int mid = lo + (hi - lo)/2;
    if (lo == mid)
    {
        if (abs(x - arr[lo]) <= abs(x - arr[hi])) return lo;
        else                  return hi;
    }

    if ((mid-1 >= 0) && (abs(x - arr[mid-1]) <= abs(x - arr[mid])))
        return my_bsearch(arr, lo, mid, x);
    else
        return my_bsearch(arr, mid, hi, x);
}

int main() {
    int M, N;
    cin >> N >> M;

    long bulls[N], cows[M];
    for (int i=0; i<N; i++) cin >> bulls[i];
    for (int i=0; i<M; i++) cin >> cows[i];

    sort(bulls, bulls + N);
    sort(cows, cows + M);

    long long min_val = 0, lo = 0, hi = M-N;
    for (int i=0; i<N; i++) {
        lo = my_bsearch(cows, lo, hi, bulls[i]);
        min_val += abs(bulls[i] - cows[lo]);
        lo++, hi++;
    }
    cout<< min_val << endl;

    return 0;
} 

1 个答案:

答案 0 :(得分:1)

如这个类似的问题Can we solve the “printing neatly” problem using a greedy algorithm中所述,贪婪的解决方案常常被误入歧途。考虑以下数据:

牛:5、5

母牛:1、6、15

您的算法输出最小距离11(配对5到6,然后是5到15)。但是最佳解决方案显然是5(配对5:1和5:6)。

相关问题