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;
}

浙公网安备 33010602011771号