Codeforces Round#255"修改矩阵"解决方案(Div-1 B)?

时间:2014-07-16 17:13:28

标签: algorithm greedy

我试图解决CodeForces第255轮的“ DZY Loves Modification ”问题。

  

问题链接:   http://codeforces.com/contest/446/problem/B

我得到了系统测试用例的错误答案。

我的方法如下:

  1. 构造两个 max-sheaps - 一个堆用于存储行总计和 一列为总计
  2. 存储两个变量 - rowReductionValue colReductionValue - 这些变量存储之前应减去的值 使用 列的总总和。
  3. 对于每次迭代,从中选择具有最大值的条目 rowSum和colSum堆
  4. 如果选择了行,则将行的总数添加到结果中 行总数减少了P *(number_of_columns)
  5. 在此之后,每列的值减少P.所以,这个P是 添加到colReductionValue。
  6. 如果选择了列,则使用类似的方法。
  7. 这种方法导致错误答案。

    如果我不清楚解释我的方法,我很抱歉,我希望它尽可能简洁。

    对这种方法的正确方法或缺陷的任何启示都非常感激。

    代码如下:

    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;
    }
    

    谢谢 -

1 个答案:

答案 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

祝你好运!

相关问题