当前位置:首页 > 洛谷 > 洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化)

2个月前 (07-04)

洛谷P2190题解:铁路售票系统车厢计算(差分数组+前缀和优化) 洛谷题解 前缀和 C++ 第1张

一、题目解读

洛谷P2190题要求解决铁路售票系统中的车厢数量计算问题。题目给定n个车站和m条订票申请,每条申请包含区间[x,y)及乘客数z。需要计算在不超载的情况下(每节车厢最多36人),满足所有乘客需求所需的最小车厢数。问题关键在于高效处理区间修改与统计最大值。

二、解题思路

核心思路是利用差分数组+前缀和实现区间修改的优化。通过差分数组记录每个站点的乘客变化(如进入/离开人数),再计算前缀和得到各站点的实时乘客数,从而找出最大值。特别处理环形区间(即x>y时,拆分为两段处理),确保逻辑完整性。

三、解题步骤

1. 输入与初始化:读入n、m,创建长度为n+2的差分数组(多留两端便于边界处理)。

2. 处理订票申请:

○ 普通区间(x≤y):在x位置+乘客数z,y位置-乘客数z(差分核心)。

○ 环形区间(x>y):拆分为两段:[x,n]和[1,y),分别差分处理。

3. 计算前缀和:遍历差分数组,累加当前值并更新最大乘客数。

4. 计算车厢数:根据36人/车厢的规则,向上取整得到最终结果。

四、代码与注释

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n, m;  
    cin >> n >> m;  

    // 差分数组,记录每个站点的乘客变化  
    vector<int> diff(n + 2, 0);  

    // 处理每条订票申请  
    for (int i = 0; i < m; ++i) {  
        int x, y, z;  
        cin >> x >> y >> z;  

        if (x <= y) {  
            // 普通区间[x,y)  
            diff[x] += z;  
            diff[y] -= z;  
        } else {  
            // 环形区间[x,n]和[1,y)  
            diff[x] += z;  
            diff[n+1] -= z;  
            diff[1] += z;  
            diff[y] -= z;  
        }  
    }  

    // 计算前缀和,找出最大乘客数  
    int max_passengers = 0;  
    int current = 0;  
    for (int i = 1; i <= n; ++i) {  
        current += diff[i];  
        max_passengers = max(max_passengers, current);  
    }  

    // 计算所需车厢数(每节36人)  
    int carriages = (max_passengers + 35) / 36;  
    cout << carriages << endl;  

    return 0;  
}

注释说明:差分数组通过“延迟更新”简化区间修改操作,前缀和计算则快速还原真实乘客数。环形区间的特殊处理避免了逻辑漏洞。

五、总结

本解法通过差分数组巧妙转化区间修改为单点操作,结合前缀和高效求解最大值,时间复杂度O(n+m)。掌握此类“差分思想”对处理动态区间问题至关重要。代码简洁且逻辑清晰,为同类问题提供了优秀模板。

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

题目重解我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0...

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

题目重解:数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很...

洛谷2804题解:基于Fenwick树与离散化的区间统计优化方案

洛谷2804题解:基于Fenwick树与离散化的区间统计优化方案

一、题目解读洛谷2804题要求解决一个涉及区间统计的问题,核心在于高效计算满足特定条件的元素数量。题目可能涉及前缀和、区间查询或计数类操作,需处理大范围数据及可能的负数输入。通过代码分析可知,关键需求...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

标题:洛谷B3617题解析:八进制转十六进制算法实现与优化(附AC100代码)

一、题目解读洛谷B3617题要求将输入的八进制字符串转换为十六进制表示。题目需处理大数场景,且对输入合法性有明确限制(长度不超过1000,仅包含0-7字符)。由于八进制与十六进制无法直接转换,需借助十...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。