乘车问题

85 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

题目信息描述

nn 个班的小朋友乘大巴去郊游,第 ii 个班有 aiai 个人。

每隔一段时间就会来一辆空大巴车,每个大巴车可以容纳 mm 个小朋友。

已知,在安排乘车时,必须按照 11 班,22 班,…,nn 班的顺序,依次安排每个班的小朋友。

同一个班的小朋友必须被安排在同一辆车内。

也就是说,如果当前需要安排 ii 班乘坐大巴,而此时大巴剩余的座位数量少于 aiai,则让大巴先走,ii 班以及后续班级共同等待下一辆大巴到来。

请问,将所有小朋友接走,共需多少辆大巴?

输入格式

第一行包含整数 TT,表示共有 TT 组测试数据。

每组数据第一行包含两个整数 n,mn,m。

第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an。

输出格式

每组数据输出一行结果,表示所需大巴数量。

数据范围

1≤T≤301≤T≤30, 1≤n,m≤1001≤n,m≤100, 1≤ai≤m1≤ai≤m

输入样例:

2
4 3
2 3 2 1
3 4
1 2 1

输出样例:

3
1

思路

模拟

  • 假设现在第 ii 个班级准备上车,我们此时先检查当前大巴剩余空位数量 emptyempty (如果没有大巴,则剩余数量为 00)是否大于等于本班人数。
  • 如果大于等于本班人数,则不需要新的大巴,此时要更新剩余空位数量。
  • 如果小于本班人数,那么需要新的大巴。若本班人数为 a[i]a[i],则所需的大巴数量为 cnt=⌈a[i]m⌉cnt=⌈a[i]m⌉,最后一辆大巴还有 empty=cnt×m−a[i]empty=cnt×m−a[i] 个空位。

注意:时间复杂度为O(n)

代码

#include <bits/stdc++.h>
using namespace std;
​
int main() {
    int T;
    cin >> T;
    while(T--) {
​
        int n, m;
        cin >> n >> m;
        vector<int> a(n);
​
        int ret = 0, empty = 0;
​
        for(int i = 0; i < n; i++) {
            cin >> a[i];
            if(empty >= a[i]) {
                empty -= a[i];
            } else {
                int cnt = (a[i] + m - 1) / m;
                empty = m * cnt - a[i];
                ret += cnt;
            }
        }
​
        cout << ret << endl;
​
    }
    return 0;
}