B4281 [蓝桥杯青少年组国赛 2023] 月球疏散行动&P5017 [NOIP 2018 普及组] 摆渡车题解

B4281 [蓝桥杯青少年组国赛 2023] 月球疏散行动

题目背景

本题原题:P5017 [NOIP 2018 普及组] 摆渡车

题目描述

为了避免太阳爆发引起的灾难,人类决定给地球装上发动机,最终逃离太阳系。原计划要带着月球一起走,结果月球行星发动机发生灾难性故障,必须炸毁月球。为此,在月球上的工作人员都要疏散回地球。

月球基地有一艘太空穿梭机可以用来疏散工作人员。但是人们分散在各处,必须前往基地集合,他们到达基地的时间不等。穿梭机可以将抵达基地等待登机的工作人员先送回地球,然后再返回基地疏散下一批工作人员。

总共有 N 名工作人员需要疏散,太空穿梭机从月球到地球往返一次花时间 M 小时,第 i 个人抵达基地等待登机的时刻为 Ti​。

指挥官希望所有工作人员在基地等待的时间总和最小,而且他可以任意安排穿梭机的起飞时间,假定穿梭机足够大,可以装下所有工作人员,在不计登机和下机时间等因素的情况下,最小的等候时间总和是多少?

例如:N=5,M=4,1 号~5 号工作人员到达基地的时刻依次为 11、3、3、5、10,穿梭机可以在 3 时出发,先送 2 号、3 号工作人员去地球,然后于 7 时返回月球基地;此时,4 号工作人员已于 5 时到达基地,等候了 2 小时。这时让穿梭机马上送走他,然后于 11 时从地球返回基地;此时,5 号工作人员已于 10 时到达基地,等候了 1 小时;而 1 号工作人员刚好于 11 时到达基地,等候 0 小时;穿梭机于 11 时将两人送走,即完成全部疏散任务。总的等候时间 = 4 号工作人员等候时间 + 5 号工作人员等候时间 =2+1=3 小时。无法再找到有更小等候时间总和的方案。

输入格式

第一行输入两个正整数 N(1≤N≤500),M(1≤M≤100),以一个空格隔开,分别表示工作人员人数和穿梭机的往返时间。第二行输入 N 个正整数,依次表示某个工作人员到达基地等候登机的时刻 Ti​(1≤Ti​≤4000000),相邻两数之间用一个空格隔开。

输出格式

输出一个整数,表示所有工作人员等候时间之和的最小值(单位:小时)。

输入输出样例

输入 #1复制

5 4
11 3 3 5 10

输出 #1复制

3

P5017 [NOIP 2018 普及组] 摆渡车

题目背景

NOIP2018 普及组 T3

题目描述

有 n 名同学要乘坐摆渡车从人大附中前往人民大学,第 i 位同学在第 ti​ 分钟去 等车。只有一辆摆渡车在工作,但摆渡车容量可以视为无限大。摆渡车从人大附中出发、 把车上的同学送到人民大学、再回到人大附中(去接其他同学),这样往返一趟总共花费 m 分钟(同学上下车时间忽略不计)。摆渡车要将所有同学都送到人民大学。

凯凯很好奇,如果他能任意安排摆渡车出发的时间,那么这些同学的等车时间之和最小为多少呢?

注意:摆渡车回到人大附中后可以即刻出发。

输入格式

第一行包含两个正整数 n,m,以一个空格分开,分别代表等车人数和摆渡车往返一趟的时间。
第二行包含 n 个正整数,相邻两数之间以一个空格分隔,第 i 个非负整数 ti​ 代表第 i 个同学到达车站的时刻。

输出格式

输出一行,一个整数,表示所有同学等车时间之和的最小值(单位:分钟)。

输入输出样例

输入 #1复制

5 1 
3 4 4 3 5 

输出 #1复制

0

输入 #2复制

5 5 
11 13 1 5 5 

输出 #2复制

4

说明/提示

样例 1 说明

同学 1 和同学 4 在第 3 分钟开始等车,等待 0 分钟,在第 3 分钟乘坐摆渡车出发。摆渡车在第 4 分钟回到人大附中。
同学 2 和同学 3 在第 4 分钟开始等车,等待 0 分钟,在第 4 分钟乘坐摆渡车 出发。摆渡车在第 5 分钟回到人大附中。
同学 5 在第 5 分钟开始等车,等待 0 分钟,在第 5 分钟乘坐摆渡车出发。自此 所有同学都被送到人民大学。总等待时间为 0。

样例 2 说明

同学 3 在第 1 分钟开始等车,等待 0 分钟,在第 1 分钟乘坐摆渡车出发。摆渡 车在第 6 分钟回到人大附中。
同学 4 和同学 5 在第 5 分钟开始等车,等待 1 分钟,在第 6 分钟乘坐摆渡车 出发。摆渡车在第 11 分钟回到人大附中。
同学 1 在第 11 分钟开始等车,等待 2 分钟;同学 2 在第 13 分钟开始等车, 等待 0 分钟。他/她们在第 13 分钟乘坐摆渡车出发。自此所有同学都被送到人民大学。 总等待时间为 4。
可以证明,没有总等待时间小于 4 的方案。

数据规模与约定

对于 10% 的数据,n≤10,m=1,0≤ti​≤100。
对于 30% 的数据,n≤20,m≤2,0≤ti​≤100。
对于 50% 的数据,n≤500,m≤100,0≤ti​≤104。
另有 20% 的数据,n≤500,m≤10,0≤ti​≤4×106。
对于 100% 的数据,n≤500,m≤100,0≤ti​≤4×106。

思路

DP即可。

代码见下

#include<bits/stdc++.h>
using namespace std;
int n,a[1000001],m,t,b[10000001],c[12324344],d[2222222],kkk=1e8+9;
int main(){
	cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        t=max(t,a[i]);
        b[a[i]]++;
        c[a[i]]+=a[i];
    }
    for(int i=1;i<=t+m;i++){
        b[i]+=b[i-1];
        c[i]+=c[i-1];
    }
    for(int i=1;i<=t+m;i++){
        d[i]=b[i]*i-c[i];
        for(int j=max(i-m-m+1,0);j<=i-m;j++){
            d[i]=min(d[i],d[j]+(b[i]-b[j])*i-(c[i]-c[j]));
        }
    }
    for(int i=t;i<=t+m;i++){
       kkk=min(kkk,d[i]);
       //cout<<d[i];
    } 
    cout<<kkk; 
	return 0;
}

posted @ 2025-10-23 21:05  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源