C# 其中,我的算法中的缺陷是发现是否存在两个数组a,B的排列,使得它们具有(a[i]&x2B;B[i])>;=K

C# 其中,我的算法中的缺陷是发现是否存在两个数组a,B的排列,使得它们具有(a[i]&x2B;B[i])>;=K,c#,arrays,algorithm,time-complexity,greedy,C#,Arrays,Algorithm,Time Complexity,Greedy,例如,与 k=10 A=[2,1,3] B=[7,8,9] 答案是肯定的,因为您可以重新排列要显示的元素 A=[1,2,3] B=[9,8,7] 这是真的,A[i]+B[i]>=10=k,对于i=0,1,2。我的算法是贪婪的,就像 int k = parameters[1]; int[] A = Array.ConvertAll(Console.ReadLine().Split(' '), Int32.Parse); int?[] B = Array.ConvertAll(Console.R

例如,与

k=10
A=[2,1,3]
B=[7,8,9]
答案是肯定的,因为您可以重新排列要显示的元素

A=[1,2,3]
B=[9,8,7]
这是真的,
A[i]+B[i]>=10=k,对于
i=0,1,2
。我的算法是贪婪的,就像

int k = parameters[1];
int[] A = Array.ConvertAll(Console.ReadLine().Split(' '), Int32.Parse);
int?[] B = Array.ConvertAll(Console.ReadLine().Split(' '), Extensions.ToNullableInt);

Array.Sort(B);
for(int j = 0; j < A.Length; ++j)
{
    bool found = false;
    for(int m = 0; j < B.Length && !found; ++j)
    {
        if(B[m] == null)
            continue;
        if((A[j] + B[m]) >= k)
        {
            found = true;
            B[m] = null;
        }
    }
    if(!found)
    {
        Console.WriteLine("NO");
        return;
    }
}
Console.WriteLine("YES");
int k=参数[1];
int[]A=Array.ConvertAll(Console.ReadLine().Split(“”),Int32.Parse);
int?[]B=Array.ConvertAll(Console.ReadLine().Split(“”),Extensions.tonullabelint);
数组。排序(B);
对于(int j=0;j=k)
{
发现=真;
B[m]=null;
}
}
如果(!找到)
{
控制台。写入线(“否”);
返回;
}
}
控制台。WriteLine(“是”);

我想不出它会失败的案例

按降序排序
A
、排序
B
(证明这是您能实现的最佳可能性),并检查:

  int[] A = new int[] { 2, 1, 3 };
  int[] B = new int[] { 7, 8, 9 };

  int maxK = A
    .OrderBy(x => x)
    .Zip(B.OrderByDescending(x => x), (a, b) => a + b)
    .Min();

你会得到
maxK==10
这样你就可以找到所有
k的排列你调试过吗?。
Extensions.tonullabelint
如何工作?@Chris你只需要对其中一个排序。m总是0。我不确定堆栈溢出是否是让人们为您测试代码的最佳场所。@BuhBuh对type-o的调用很好,但我的代码在修复后仍然失败