我如何确定是否可以构造具有给定行和列总和的二进制矩阵?

时间:2019-05-29 03:59:39

标签: c++ algorithm matrix

输入:

输入的第一行包含两个数字1≤m,n≤100000,即矩阵的行数和列数。下一行包含m个数字0≤ri≤n–矩阵中每一行的总和。第三行包含n个数字0≤cj≤m–矩阵中每一列的总和。

输出:

如果存在一个m×n矩阵A,且每个元素为0或1,则输出“ YES”。否则为“ NO”

时间限制:1秒

TestCase 1示例

Input
2
3 2
2 1 0 
1 2 
3 3
3 2 1 
1 2 2
Output
YES
NO

对于第一个测试用例

根据输入,形成矩阵,  第一行应具有2 1,第二行应具有1 1和0 1在最后一行。 第一列应具有1 1,第二列应具有2 1

矩阵可以如下所示

     column1 column2 column3 
row1    1       1      0
row2    0       1      0
row3    0       0      0 

对于第二个测试用例 具有给定输入的布尔矩阵是不可能的

我想要一种算法来找到解决方案。有人可以帮我吗?

我用下面的代码。但是复杂度是O(n2)。任何人都可以用可以在1秒内解决问题的代码提出更好的算法

bool satisfiable(std::vector<int> a, std::vector<int> b) {
    while (!a.empty()) {
        std::sort(b.begin(), b.end(), std::greater<int>());
        int k = a.back();
        a.pop_back();
        if (k > b.size()) return false;
        if (k == 0) continue;
        if (b[k - 1] == 0) return false;
        for (int i = 0; i < k; i++)
        b[i]--;
  }
  for (std::vector<int>::iterator i = b.begin(); i != b.end(); i++)
    if (*i != 0)
      return false;
  return true;
}

0 个答案:

没有答案