C++ 贪婪二进制搜索C++;

C++ 贪婪二进制搜索C++;,c++,algorithm,binary-search,C++,Algorithm,Binary Search,我正在努力解决这个问题 问题 给定整数数组V、W和成对数组C(开始、结束)。你必须找到i,j,使得W[j]-V[i]最小,并且至少有一对应该位于V[i]和W[j]之内 算法 根据开始时间对W和竞赛进行排序 对于V中的每个V[i],二进制搜索以查找开始时间>=V[i]的竞赛,让找到的竞赛位于索引c(小c) 在W中找到W[i],使其成为第一个元素>=Contest[c]。结束时间,设为j t2=W[j],t1=W[i],然后ans=min(ans,t2-t1+1) 然而,尽管逻辑对我和四分之三的

我正在努力解决这个问题

问题

给定整数数组V、W和成对数组C(开始、结束)。你必须找到i,j,使得W[j]-V[i]最小,并且至少有一对应该位于V[i]和W[j]之内

算法

  • 根据开始时间对W和竞赛进行排序
  • 对于V中的每个V[i],二进制搜索以查找开始时间>=V[i]的竞赛,让找到的竞赛位于索引c(小c)
  • 在W中找到W[i],使其成为第一个元素>=Contest[c]。结束时间,设为j
  • t2=W[j],t1=W[i],然后ans=min(ans,t2-t1+1)
然而,尽管逻辑对我和四分之三的测试用例来说听起来不错,但这似乎并没有通过其他测试用例

这是我的密码

int i;
// Input
cin >> n >> x >> y;

V = new int[x];
W = new int[y];
C = new pair<int, int>[n];

for (i = 0;i < n;i++)
    cin >> C[i].first >> C[i].second;

for (i = 0;i < x;i++)
    cin >> V[i];

for (i = 0;i < y;i++)
    cin >> W[i];

// End Input

sort(W, W + y);
sort(C, C + n);

int ans = INT_MAX, c, t1, t2, j; 
for (i = 0;i < x;i++)
{
    t1 = V[i];
    // gr_eq is equivalent to std::lower_bound for pair<int, int>
    // Def: gr_eq(pair<int,int>,low,high,target)
    c = gr_eq(C, 0, n - 1, t1); 
    // he will attend the cth contest
    if (c >= 0)
    {
        j = gr_eq(W, 0, y - 1, C[c].second); // lower_bound for integer array
        if (j >= 0)
        {
            t2 = W[j];
            ans = min(ans, t2 - t1 + 1);
        }
    }
}

/* output */
cout << ans << endl;

// Free memory
delete [] V;
delete [] W;
delete [] C;
inti;
//输入
cin>>n>>x>>y;
V=新整数[x];
W=新整数[y];
C=新对[n];
对于(i=0;i>C[i]。第一>>C[i]。第二;
对于(i=0;i>V[i];
对于(i=0;i>W[i];
//终端输入
排序(W,W+y);
排序(C,C+n);
int ans=int_MAX,c,t1,t2,j;
对于(i=0;i=0)
{
j=gr_eq(W,0,y-1,C[C].秒);//整数数组的下界
如果(j>=0)
{
t2=W[j];
ans=min(ans,t2-t1+1);
}
}
}
/*输出*/
cout=目标)
高=中;
其他的
低=中+1;
}
如果(a[低]。第一个>=目标)
低回报;
其他的
返回-1;
}
整数gr_均衡(整数*a、整数低位、整数高位、整数目标)
{
int mid;
while(低<高)
{
中等=(低+高)/2;
如果(a[mid]>=目标)
高=中;
其他的
低=中+1;
}
如果(a[低]>=目标)
低回报;
其他的
返回-1;
}

您没有确切说明代码失败的情况,也没有详细说明gr_eq的确切定义。
但是,如果它确实使用(或完全模仿)lower_bound(),那么它的搜索范围是[first,last],而不是[first,last],或者换句话说,从first,included,到last,not included将不包括在提供的范围内。

好的,您的问题是什么?我做错了什么?是否存在实现或逻辑错误?您需要调试。找到一个失败的示例输入。逐步检查代码。查看是否按预期工作。发现是否按预期工作。如果问题陈述简单,“它不起作用“。请您的问题更完整地描述您预期会发生什么,以及这与实际结果之间的差异。请参阅,以获取关于什么是一个好的解释的提示。我找不到任何与我上面提到的逻辑相反的例子,这适用于我想到的每个测试用例,并且按照政策,测试数据是保密的。
//
// Find number >= targer
//
int gr_eq(pair<int, int> * a, int low, int high, int target)
{
    int mid;
    while (low < high)
    {
        mid = (low+high)/2;
        if (a[mid].first >= target)
            high = mid;
        else
            low = mid + 1;
    }

    if ( a[low].first >= target)
        return low;
    else
        return -1;
}

int gr_eq(int * a, int low, int high, int target)
{
    int mid;
    while (low < high)
    {
        mid = (low+high)/2;
        if (a[mid] >= target)
            high = mid;
        else
            low = mid + 1;
    }

    if ( a[low] >= target)
        return low;
    else
        return -1;
}