Atcoder(294) E - 2xN Grid

题目链接:E - 2xN Grid

题意:给我们一面长度为L的墙,分为上下两部分,每个部分都会有L列。现如今我们给出一个N1和N2,N1代表的上面墙给出的数据组数,N2表示的是下面的墙有多少组数据。每一组数据都是由两个数组成的,分别是数和长度。例如1  2表示的就是在开始的位置连续两个方块都是1。3  2表示的就是从上一次结束的位置开始我们由2块方块上写着3。最后让我们求出一共会有多少列的数据是一样的。

如果题意没看明白的可以自己对着下面的图模拟一下。

 

大体思路:

我们可以枚举所有的组数,当上面的墙的开始位置和下面的墙的开始位置是对应上的时候我们的结果就加上上面长度和下面长度的最小值。当上下两个的结尾不一样的时候我们就分情况讨论一下,当上面的连续长度大于下面的连续长度,这时候我们就可以让长的那一个部分减去上下墙长度的公共长度,并且让短的哪一个部分,往后走一位,这样就能实现我们的目的了。

具体的代码如下:

#include <bits/stdc++.h>
using namespace std;

#define endl '\n';
typedef pair<int, int> PII;
typedef long long ll;
const int N = 2e5 + 10, mod = 998244353;
ll a[N], b[N];
void solve()
{
    ll l, n, m;
    cin >> l >> n >> m;
    for (ll i = 0; i < n; i++)
        cin >> a[i] >> b[i];
    for (ll i = n; i < n + m; i++)
        cin >> a[i] >> b[i];

    ll c = 0, d = n, res = 0;
    for (ll i = 0; i < n + m; i++)
    {
        if (a[c] == a[d])
            res += min(b[c], b[d]);

        if (b[c] < b[d])
        {
            b[d] -= b[c];
            c++;
        }
        else
        {
            b[c] -= b[d];
            d++;
        }
    }
    cout << res << endl;
}

int main()
{

    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(0);

    solve();
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值