【问题标题】:Codeforces Round #255 "Modifying matrix" solution(Div-1 B)?Codeforces 第 255 轮“修改矩阵”解决方案(Div-1 B)?
【发布时间】:2014-09-07 08:04:33
【问题描述】:

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

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

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

我的做法如下:

  1. 构造两个 ma​​x-heaps - 一个用于存储行总数和 一个用于列总计
  2. 存储两个变量 - rowReductionValuecolReductionValue - 这些变量存储之前应该减去的值 使用列的总数总和。
  3. 对于每次迭代,从 rowSum 和 colSum 堆
  4. 如果选择了一行,则将该行的总数添加到结果中,然后 行总数减少了 P * (number_of_columns)
  5. 此后,每列的值减少 P。所以,这个 P 是 添加到 colReductionValue。
  6. 如果选择了列,则会使用类似的方法。

这种方法会导致错误的答案。

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

非常感谢任何关于正确方法或该方法缺陷的说明。

代码如下:

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

谢谢-

【问题讨论】:

    标签: algorithm greedy


    【解决方案1】:

    我将引导您了解我用来解决此问题的贪婪暴力概念:

    如果p = 0,显然最好的选择是选择每次都能产生最大愉悦值的行或列。

    让我们先忽略p,然后我们可以使用前面的语句得到最大数量的ans。现在如果我们为i次选择行,为ki次选择列,ans应该是ansi - ((ki) X i X p).

    所以我们可以从 0 到 k 枚举 i 并计算 ansi - ((ki) X i X p) 每次,max{ansi - ((ki) X i X p)} 是 DZY 可以获得的最大快乐值。

    ai为我们选择i行和bi后所能得到的最大快乐值sub> 是我们选择 i 列后可以获得的最大快乐值。那么ansi = ai+bk-i。我们可以使用两个优先级队列快速计算出aibi

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多