我试图解决CodeForces第255轮的“ DZY Loves Modification ”问题。
我得到了系统测试用例的错误答案。
我的方法如下:
这种方法导致错误答案。
如果我不清楚解释我的方法,我很抱歉,我希望它尽可能简洁。
对这种方法的正确方法或缺陷的任何启示都非常感激。
代码如下:
long long getMaxResult(int rows, int cols, int reductionValue, int K)
{
vector<long long> rowSums, colSums;
long long rowReductionValue = 0, colReductionValue = 0, result = 0;
for(int row = 0; row < rows; ++row)
{
long long sum = 0;
for(int col = 0; col < cols; ++col)
{
sum += a[row][col];
}
rowSums.push_back(sum);
}
for(int col = 0; col < cols; ++col)
{
long long sum = 0;
for(int row = 0; row < rows; ++row)
{
sum += a[row][col];
}
colSums.push_back(sum);
}
make_heap(rowSums.begin(), rowSums.end());
make_heap(colSums.begin(), colSums.end());
for(int k = 0; k < K; ++k)
{
pop_heap(rowSums.begin(), rowSums.end());
long long rowMax = rowSums.back();
rowSums.pop_back();
pop_heap(colSums.begin(), colSums.end());
long long colMax = colSums.back();
colSums.pop_back();
if(rowMax - rowReductionValue >= colMax - colReductionValue)
{
result += rowMax - rowReductionValue;
rowMax -= reductionValue * cols;
colReductionValue += reductionValue;
}
else
{
result += colMax - colReductionValue;
colMax -= reductionValue * rows;
rowReductionValue += reductionValue;
}
rowSums.push_back(rowMax);
push_heap(rowSums.begin(), rowSums.end());
colSums.push_back(colMax);
push_heap(colSums.begin(), colSums.end());
}
return result;
}
谢谢 -
答案 0 :(得分:0)
我将引导您完成我曾经遇到的贪婪 - 暴力概念:
如果 p = 0 ,显然最好的选择是选择每次都能给出最大乐趣值的行或列。
首先忽略 p ,然后我们可以使用之前的语句获得最大数字 ans 。现在,如果我们为 i 次选择行,请选择 ki 次列, ans 应为 ans i - ((ki)X i X p)。
所以我们可以枚举i从0到k并且每次计算 ans i - ((ki)X i X p),max { ans < sub> i - ((ki)X i X p)}是DZY可以获得的最大可能乐趣值。
让 a i 成为我们在选择 i 行和 b i后可获得的最大乐趣值 是选择 i 列后我们可以获得的最大乐趣值。然后 ans i = a i + b k-i 。我们可以使用两个优先级队列来快速计算 a i 和 b i 。
祝你好运!