公交车剩余车票算法题

这篇博客探讨了一个有n个站点的公交线路问题,公交车有m个座位,已售出p张车票,每张车票指定从s[i]到d[i]的有效区间。算法旨在计算从a站点到b站点最多能剩余多少张可用的车票。通过输入实例展示了不同售票情况对剩余票数的影响,并提供了一个Java程序来解决这个问题。

问题:

一条路有n个公交车站,第一个站点的下标是0。这条路上有一辆公交车,有m个座位,意思是在起始站可以卖出m个车票。

此时,有p张车票被卖出去了,对于每张车票P[i],从s[i]开始到d[i]站点。

请问从a站点到b站点,最多剩余多少张票可以用?

输入:

第一行输入n  m  p (n个站点,m张票,卖出p张)

第二部分输入卖出的p张车票的站点

p1  d1

p2  d2

p3  d3

最后一行输入我们要乘坐的a到b站点。

思考:

第一种情况
//输入
5 10 3
0 3
1 2
3 4
1 3
//输出 8
5个站点 10张票,卖出3个分别是
03 12 34
要从1到3
03 12 和13有交集,所以占用了2个,剩余8个

第一种情况:
5个站点的情况下。卖出4个,01 12 23 34
但是只会占用1个座位。

答案:

mport java.util.Scanner;

public class Main {
    public static void main( String[] args ) {

        Scanner input = new Scanner( System.in );

        int N = input.nextInt();
        int M = input.nextInt();
        int P = input.nextInt();

        int[] people = new int[N];

        for( int i = 0; i < P; ++ i ) {
            int s = input.nextInt();
            int d = input.nextInt();
            for( int j = s; j < d; ++ j )
                people[j] ++;
        }

        int start = input.nextInt();
        int end = input.nextInt();

        int max = Integer.MIN_VALUE;
        for( int i = start; i < end; ++ i )
            if( max < people[i] )
                max = people[i];
        
        System.out.print( M - max );

        input.close();
    }
}

该铁路经过 N N 个城市,每个城市都有一个站。不过,由于各个城市之间不能协调好,于是乘车每经过两个相邻的城市之间(方向不限),必须单独购买这一小段的车票。第 i i 段铁路连接了城市 i i 和城市 i + 1 ( 1 ≤ i < N ) i+1(1≤i<N)。如果搭乘的比较远,需要购买多张车票。第 i i 段铁路购买纸质单程票需要 A i A i ​ 博艾元。 虽然一些事情没有协调好,各段铁路公司也为了方便乘客,推出了 IC 卡。对于第 i i 段铁路,需要花 C i C i ​ 博艾元的工本费购买一张 IC 卡,然后乘坐这段铁路一次就只要扣 B i ( B i < A i ) B i ​ (B i ​ <A i ​ ) 元。IC 卡可以提前购买,有钱就可以从网上买得到,而不需要亲自去对应的城市购买。工本费不能退,也不能购买车票。每张卡都可以充值任意数额。对于第 i i 段铁路的 IC 卡,无法乘坐别的铁路的车。 Uim 现在需要出差,要去 M M 个城市,从城市 P 1 P 1 ​ 出发分别按照 P 1 , P 2 , P 3 , ⋯   , P M P 1 ​ ,P 2 ​ ,P 3 ​ ,⋯,P M ​ 的顺序访问各个城市,可能会多次访问一个城市,且相邻访问的城市位置不一定相邻,而且不会是同一个城市。 现在他希望知道,出差结束后,至少会花掉多少的钱,包括购买纸质车票、买卡和充值的总费用。 输入格式 第一行两个整数, N , M N,M。 接下来一行, M M 个数字,表示 P i P i ​ 。 接下来 N − 1 N−1 行,表示第 i i 段铁路的 A i , B i , C i A i ​ ,B i ​ ,C i ​ 。 输出格式 一个整数,表示最少花费 输入 #1 复制代码 9 10 3 1 4 1 5 9 2 6 5 3 200 100 50 300 299 100 500 200 500 345 234 123 100 50 100 600 100 1 450 400 80 2 1 10 输出 #1 复制代码 6394 提示 2 2 到 3 3 以及 8 8 到 9 9 买票,其余买卡。 对于 30 % 30% 数据 M = 2 M=2。 对于另外 30 % 30% 数据 N ≤ 1000 , M ≤ 1000 N≤1000,M≤1000。 对于 100 % 100% 的数据 M , N ≤ 1 0 5 , A i , B i , C i ≤ 1 0 5 M,N≤10 5 ,A i ​ ,B i ​ ,C i ​ ≤10 5 。 c++daima
03-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七号公园的忧伤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值