CF1219G Harvester 题解

CF1219G Harvester 题解

(从luogu上搬过来了!)

[Harvester题面]

个人感觉这题在绿题范围

题面描述

n * m的网格中,在第i行j列有a[i][j]个泡泡,每次可以收割一行或一列的泡泡,最多可以收割4次,问最多可以收割到多少泡泡。

分析

1.错误的想法①

拿到题面,我首先的思路是一个简易的模拟:

直接读入二维数组,首先用前缀和统计每一行和每一列的总和

 

for(ll i=1;i<=n;i++)
{
    for(ll j=1;j<=m;j++)
    {
        cin>>a[i][j];
        xx[i]+=a[i][j];
        yy[j]+=a[i][j];
    }
}

 

再在行和列中找到当前收割走此行/列后可以得到最多泡泡的行/列,每次收割走就把它会影响到的行/列处理一下

具体例子如第二个样例

5 5

0 9 2 7 0

9 0 3 0 5

0 8 0 3 1

6 7 4 3 9

3 6 4 1 0

第一次我们拿了第四行(xx[4]),所以要把所有列的前缀和都减去a[4][j],以防重复添加。

然后再重复四次。

提交后,惊奇地发现,第四个点就WA了,why?

这种想法很显然是错误的,当我们发现某行取走能得到当前的最大值,然后取了这行之后会把所有列都减小,但是有可能此时取要多个列更优。即这种模拟做法可能会失去最大的结果

2.错误的想法②

既然会失去某些结果,那要不就在上一种代码的思路上dfs把所有能取的方法走一遍

但是,显而易见这种 O(C_{n+m}^4)  的复杂度会炸掉(提交后第4个点就TLE了)

3.正解

那么这条路看起来已经走到头了,所以正解要怎么搞!?

不妨换一种思路,既然只有四次取泡泡的机会,那取的方案应该只有5种:

1.取四行

<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值