输入:
输入的第一行包含两个数字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;
}