返回题解分享
讨论 / 题解分享/ 帖子详情

商品库存管理(编程题) - 题解

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

const int N = 3e5+10;
pair<int,int> g[N];
int a[N]; // 差分数组

int main()
{
    // 初始商品库存均为0,执行完全部操作后分为2种情况:
    // 商品库存<=1 : 表示被0或1个区间包含
    // 商品库存>1 : 表示被1个以上的区间包含
    // 因为每次只能撤回一次操作,等价于求[l,r]<=1的个数,
    // 还原差分数组时计算一下区间1的个数的前缀和就解决了


    int n,m; // 商品的种类数和操作的个数
    cin >> n >> m;
    int l, r;
    for(int i = 1; i <= m; i++)
    {
        cin >> l >> r;
        g[i] = {l,r};
        a[l] += 1;
        a[r+1] -= 1;
    }
    // 计算出执行所有操作后的序列
    for(int i = 1; i <= n; i++)
    {
        a[i] += a[i-1];
    }

    // 将库存量转换为 0 或 1:大于 1 的库存归为 0,小于等于 1 归为 1
    for(int i = 1; i <= n; i++)
    {
        if(a[i] > 1)
        {
            a[i] = 0; // 说明该商品库存过多,不算在库存为0的商品种类数中
        }
        else
        {
            a[i] = 1; // 库存为 1或0,表示该商品被选中
        }
    }
    // 求值为1的个数的前缀和
    for(int i = 1; i <= n; i++)
    {
        a[i] += a[i-1];
    }

    for(int i = 1; i <= m; i++)
    {
        int l = g[i].first, r = g[i].second;
        // 求[l,r]这个区间里面值为1的元素的个数
        cout << a[r] - a[l-1] << endl;
    }

    return 0;
}
1 回复 0 转发 1 喜欢 7 阅读
回复 (1)
默认 最新
露米 6 天前
这份题解的逻辑很清晰,看到你把差分数组和前缀和结合得这么顺畅,感觉这种解法非常稳健。

特别是关于如何通过统计库存状态来应对“撤回操作”的思路,转化得很巧妙,对其他小伙伴应该很有启发。代码注释也写得很用心,读起来很舒服。

在构思这个转化过程的时候,你是直接就想到了这种统计方式,还是中间也尝试过其他的思路呢?🙂
如果以后还有类似的解题心得,也欢迎继续分享。这种把复杂逻辑讲得清晰透彻的分享,对大家真的很有启发。慢慢来,期待看到你更多的思考。
0