C++ 我能';我想不出一个好的算法
有一个魔术板。魔术板有N*N个单元格:N行和N列。每个单元格包含一个整数,最初为0。让行和列的编号从1到N 有两种类型的操作可应用于魔术板: •行集i x:这意味着在执行此操作后,行i上单元格中的所有整数都已更改为x •ColSet i x:这意味着在此操作后,列i上单元格中的所有整数都已更改为x 您的朋友有时对某行或某列上的整数0的总数感兴趣: •行查询i:这意味着您应该回答第i行的0总数 •ColQuery i:这意味着您应该回答第i列上0的总数 输入 第一行输入包含两个空格分隔的整数N和Q。它们表示魔术板的大小,以及来自朋友的操作和查询的总数 然后,接下来的每一行都包含一个操作或一个按照上述格式进行的查询 输出 对于每个查询,输出查询的答案 约束条件 一,≤ N、 Q≤ 500000(5*105) 一,≤ 我≤ N x∈ {0,1}(即x=0或1) 样本输入: 36 行查询1 ColSet 1 行查询1 查询1 行集10 查询1 输出: 三, 二, 0 一,C++ 我能';我想不出一个好的算法,c++,C++,有一个魔术板。魔术板有N*N个单元格:N行和N列。每个单元格包含一个整数,最初为0。让行和列的编号从1到N 有两种类型的操作可应用于魔术板: •行集i x:这意味着在执行此操作后,行i上单元格中的所有整数都已更改为x •ColSet i x:这意味着在此操作后,列i上单元格中的所有整数都已更改为x 您的朋友有时对某行或某列上的整数0的总数感兴趣: •行查询i:这意味着您应该回答第i行的0总数 •ColQuery i:这意味着您应该回答第i列上0的总数 输入 第一行输入包含两个空格分隔的整数N和Q
怎么办?时间限制为0.6秒,因此在2D阵列上标记操作的天真算法无法工作。如果您想不出一个好的算法,请尝试以下技术:
board[row][column]
来表示board上的单元格。
手工:
查看上面的代码,我们可以注意到一种模式,即列索引每次都在变化,变化幅度为1。所以我们可以把它放在一个循环中:
Set column to zero.
While column is less than 4 do:
board[0][column] = 0;
column = column + 1;
end-while
下一步是将其转换为一些代码:
unsigned int column;
unsigned int board[4][4];
for (column = 0; column < 4; ++column)
{
board[0][column] = 0;
}
通过提供函数签名,我们可以将其转换为独立函数:
void Set_Row(unsigned int& array[4][4],
unsigned int row,
unsigned int value)
{
// Insert above code fragment here.
}
接下来,为其他命令生成函数。创建一个
main
函数来读取命令。运行该程序,注意任何问题所在,例如能够在运行时声明任何大小的矩阵。
添加代码以解决问题。
重复。您是否刚刚将一个完整的未格式化的家庭作业问题发布到stackoverflow 0\o?请阅读常见问题。在stackoverflow中,这个问题太本地化了,无法提问,它不是您面临的一般或有趣的编程问题,它只是您简单的CS101作业。除了寻求帮助之外,您不会什么都不做。您不会。是的,而且看起来很有效。这不是家庭作业问题!如果这个答案对你有帮助的话,记得检查一下。你真的认为对于给定的数据范围,这个答案会在0.6秒的时间限制下吗?这是一个幼稚的算法,我已经想到了,并拒绝了。所以,这是行不通的。谢谢。你在你的帖子里说:1。0.6秒的时间限制,并且您已经实现了一个算法?
unsigned int row = 0;
unsigned int value = 0;
unsigned int column;
unsigned int board[4][4];
for (column = 1; column < 4; ++column)
{
board[row][column] = value;
}
void Set_Row(unsigned int& array[4][4],
unsigned int row,
unsigned int value)
{
// Insert above code fragment here.
}