列表

详情


NC16744. 配送

描述

配送员每天都在为人们美好的生活辛勤工作。
在某位同城配送员的时刻表上,有n个任务,表示他在某年某月某一刻必须出现在某地把包裹交到对应的顾客手上。
配送员需要通过公共交通在城市里穿梭。在这个城市里,有m条公交线路,这些公交线路都是直达的(在起点和终点之间不存在其他站点),每天每条线路都有固定的发车和到达时间,还有搭乘它们的价格。城市里有k个关键点,所有任务的目标点以及所有线路的起终点都在这些关键点上。
现在问,在能保证所有任务准时完成的情况下,最少需要花费多少金钱。

输入描述

第一行三个正整数n, m, k分别表示配送任务数、公交线路数以及城市中包含的关键点点数。
接下来n行,每行一个整数x和一个字符串t,表示需要在恰好t时刻把一个包裹送到下标为x的地点(顾客不会提早到达预定地点,也不能容忍配送员迟到,所以如果配送员早到的话,他需要等到时刻t)。数据保证任务以t升序的形式给出。
接下来m行,每行三个整数和两个字符串S, T, p, t1,t2,表示S到T有一条价格为p的公交线路,这条线路在每天的t1时刻发车,在t2时刻到达。这些线路都是单向的。
1 <= n <= 10
1 <= m <= 500
1 <= k <= 100
1 <= x <= k
t是Year.Month.Day HH:MM:SS.SSS的形式,其中Year表示年份,Month表示月份,Day表示日期,HH表示小时,MM表示分钟,SS.SSS表示秒数。Day和HH之间是一个空格。数据保证t在2018.07.01 00:00:00.000到2018.07.07 23:59:59.999之间。假设现在的时间是2018.06.30 23:59:59.999,配送员正在1号点上。
数据保证没有两个任务的交货时间是同时的,因此不会发生冲突。
1 <= S, T <= k, S != T
0 < p <= 1,000
数据保证t1、t2在00:00:00.000到23:59:59.999之间,且都是当日出发,当日结束的行程(即t2 > t1)。 
对于每个任务,司机需要在严格小于预约时间的时刻到达,在严格大于预约时间的时刻离开。
在这个问题中,不用考虑路上可能的延误。对于行程之间的接续,需要保证后一个行程的起始时间严格大于前一个行程的到达时间。
我们并不在意配送员最后在哪一个地点。
数据保证所有的时间格式合法。Month,Day,HH,MM均为长度为2的字符串,SS.SSS为长度为6的字符串,Year为长度为4的字符串。

输出描述

输出一个整数表示最少需要花费的金钱。
如果不能完成所有任务,请输出-1。

示例1

输入:

2 4 5
1 2018.07.01 10:00:00.000
5 2018.07.02 10:00:00.000
1 2 500 16:00:00.000 17:00:00.000
2 5 500 00:00:00.000 02:00:00.000
2 3 100 20:00:00.000 21:00:00.000
3 5 100 08:00:00.000 09:00:00.000

输出:

700

说明:

配送员有两个任务,他先等在1号地点完成任务1,然后依次通过行程1、3、4到达5号地点完成任务,一共花费700的金钱。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 192ms, 内存消耗: 19224K, 提交时间: 2018-12-14 07:25:16

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
public class Main{
	static int dd = 1, md, dq = 0;
	static long xzon = Long.MAX_VALUE, dzon = 0;
	static String dt = "23:59:59.999", mt, dr = "2018.07.00", mr;
	static ArrayList<che> ch[];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt(), m = sc.nextInt(), k = sc.nextInt();
		ch = new ArrayList[k + 1];
		ArrayList<renwu> li = new ArrayList<>();
		for (int i = 0; i < n; i++) {
			int a = sc.nextInt();
			String b = sc.next(), c = sc.next();
			li.add(new renwu(a, b, c));
		}
		for (int i = 0; i < m; i++) {
			int a = sc.nextInt(), b = sc.nextInt(), c = sc.nextInt();
			String s1 = sc.next(), s2 = sc.next();
			if (ch[a] == null)
				ch[a] = new ArrayList<>();
			ch[a].add(new che(a, b, c, s1, s2));
		}
		for(int i=1;i<=k;i++) {
			if(ch[i]!=null)Collections.sort(ch[i], new Comparator<che>() {
				@Override
				public int compare(che o1, che o2) {					
					return o1.money<o2.money?-1:1;
				}
			});
		}
		li.sort(new Comparator<renwu>() {
			@Override
			public int compare(renwu o1, renwu o2) {
				int a = o1.time1.compareTo(o2.time1);
				if (a != 0)
					return a;
				return o1.time2.compareTo(o2.time2);

			}
		});
		for (int i = 0; i < n; i++) {
			renwu rt = li.get(i);
			md = rt.didian;
			mr = rt.time1;
			mt = rt.time2;
			digui();
			if (xzon == Long.MAX_VALUE) {
             System.out.println(-1);return;
			}			
			dq=0;
			dd=md;
			dt = rt.time2;
			dr = rt.time1;
			dzon += xzon;
			xzon=Long.MAX_VALUE;
		}
		System.out.println(dzon);
		
	}
	private static void digui() {
		if (dd == md) {
			if ( dr.compareTo(mr) < 0||(dr.compareTo(mr)==0&&dt.compareTo(mt)<0))
				{xzon = Math.min(xzon, dq);}					
		} else {
			if (dr.compareTo(mr) == 0&&ch[dd]!=null) {
				String pdt = dt;
				int pdd = dd;
				int pdq=dq;
				for (int i = 0; i < ch[dd].size(); i++) {
					che tem = ch[dd].get(i);
					if (dt.compareTo(tem.kai) < 0&&dq+tem.money<xzon) {
						dt = tem.ting;
						dd = tem.end;
						dq += tem.money;
						digui();
						dt = pdt;
						dd = pdd;
						dq = pdq;
					}
				}
			} else if (dr.compareTo(mr) < 0&&ch[dd]!=null) {
				String pdt = dt;
				int pdd = dd;
				int pdq=dq;
				String pdr=dr;
				for (int i = 0; i < ch[dd].size(); i++) {
					che tem = ch[dd].get(i);
					if (dt.compareTo(tem.kai) < 0&&dq+tem.money<xzon) {
						dt = tem.ting;
						dd = tem.end;
						dq += tem.money;
						digui();
						dt = pdt;
						dd = pdd;
						dq = pdq;
					} else if(dq+tem.money<xzon){
						dt = tem.ting;
						dd = tem.end;
						dq += tem.money;
						add();
						digui();
						dt = pdt;
						dd = pdd;
						dq = pdq;
						dr = pdr;
					}

				}
			}
		}

	}

	private static void add() {
		switch (dr) {
		case "2018.07.00":
			dr = "2018.07.01";
			break;
		case "2018.07.01":
			dr = "2018.07.02";
			break;
		case "2018.07.02":
			dr = "2018.07.03";
			break;
		case "2018.07.03":
			dr = "2018.07.04";
			break;
		case "2018.07.04":
			dr = "2018.07.05";
			break;
		case "2018.07.05":
			dr = "2018.07.06";
			break;
		case "2018.07.06":
			dr = "2018.07.07";
			break;
		}
	}
}

class renwu {
	int didian;
	String time1, time2;
	public renwu(int didian, String time1, String time2) {
		this.didian = didian;
		this.time1 = time1;
		this.time2 = time2;
	}
}

class che {
	int start;
	int end;
	int money;
	String kai;
	String ting;

	public che(int start, int end, int money, String kai, String ting) {
		this.start = start;
		this.end = end;
		this.money = money;
		this.kai = kai;
		this.ting = ting;
	}
}

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 600K, 提交时间: 2018-07-02 21:52:00

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+5,M=1e5+5,inf=2e9;
struct node{
    int x,cost,nxt;
    string t1,t2;
}a[N],e[N];
bool cmp(node a,node b){
    if(a.t1==b.t1) 
        return a.t2<b.t2;
    return a.t1<b.t1;
}
int head[N],tot=0;
bool vis[N],mp[N][N];
int n,m,k,cnt=2e9,ed;
string ed_day="",ed_tim="";
void add_edge(int u,int v,int cost,string t1,string t2)
{
	e[tot].x=v,e[tot].cost=cost,e[tot].t1=t1,e[tot].t2=t2;
	e[tot].nxt=head[u];
	head[u]=tot++;
}
void dfs(int u,int cost,string day,string tim){
    if(day>ed_day||(day==ed_day&&tim>=ed_tim)||cost>=cnt)
        return;
    if(u==ed){
        cnt=cost; 
        return;
    }
    for(int i=head[u];i!=-1;i=e[i].nxt)
    {
       	int v=e[i].x;
       	if(vis[v])	continue;
        if(e[i].t1>tim)
        {
            vis[v]=true;
            dfs(v,cost+e[i].cost,day,e[i].t2);
            vis[v]=false;
        }
        else{
            string nxt_day="";
            if(day=="2018.06.30")
                nxt_day="2018.07.01";
            else
            {
                nxt_day=day;
                nxt_day[9]=day[9]+1;
            }
            vis[v]=true;
            dfs(v,cost+e[i].cost,nxt_day,e[i].t2);
            vis[v]=false;
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    memset(head,-1,sizeof(head));
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)    cin>>a[i].x>>a[i].t1>>a[i].t2;
    sort(a+1,a+1+n,cmp);
      
    for(int i=1;i<=m;i++)
    {
        string t1,t2;
        int u,v,x;
        cin>>u>>v>>x>>t1>>t2;
     	add_edge(u,v,x,t1,t2);
    }
    int res=0;
    a[0].x=1,a[0].t1="2018.06.30",a[0].t2="23:59:59.999";
    for(int i=1;i<=n;i++)
    {
        cnt=2e9;
        memset(vis,0,sizeof(vis));
        ed=a[i].x,ed_day=a[i].t1,ed_tim=a[i].t2;
          
        vis[a[i-1].x]=true;
        dfs(a[i-1].x,0,a[i-1].t1,a[i-1].t2);
        if(cnt>=2e9)
        {
            cout<<-1<<'\n';
            return 0;
        }
        res+=cnt;
    }
    cout<<res<<'\n';
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 13ms, 内存消耗: 1132K, 提交时间: 2020-04-03 20:38:20

#include<bits/stdc++.h>
using namespace std;
int n,m,k,res;
struct T
{
	int pos;
	string tim;
	bool operator < (const T &t) const
	{
		return tim<t.tim;
	}
}task[12];
struct edge
{
	int v,C;
	string t1,t2;
	edge(){}
	edge(int v,int C,string t1,string t2):v(v),C(C),t1(t1),t2(t2){}
};
vector<edge> G[105];
unordered_map<string,int> mp;
void dfs(int S,T tk,string t1,int val)
{
	if(S==tk.pos)
	{
		res=min(res,val);
		return;
	}
	for(edge e:G[S])
	{
		if(e.t2>=tk.tim||e.t1<=t1) continue;
		if(e.v==tk.pos)
		{
			res=min(res,val+e.C);
			continue;
		}
		if(mp.count(e.t1)&&mp[e.t1]<=val+e.C)
		continue;
		mp[e.t1]=val+e.C;
		dfs(e.v,tk,e.t2,val+e.C);
	}
}
int main()
{
	while(cin>>n>>m>>k)
	{
		string t1,t2;
		int u,v,co;
		for(int i=0;i<n;i++)
		{
			cin>>task[i].pos>>t1>>t2;
			task[i].tim=t1+" "+t2;
		}
		sort(task,task+n);
		for(int i=0;i<m;i++)
		{
			cin>>u>>v>>co>>t1>>t2;
			for(int j=1;j<=7;j++)
			{
				string t3="2018.07.0"+to_string(j)+" "+t1;
				string t4="2018.07.0"+to_string(j)+" "+t2;
				G[u].push_back(edge(v,co,t3,t4));
			}
		}
		int ans=0,S=1;
		string ttt="2018.06.30 23:59:59.999";
		for(int i=0;i<n;i++)
		{
			mp.clear();
			res=2e9+5;
			dfs(S,task[i],ttt,0);
			if(res>2e9) break;
			ans+=res;
			S=task[i].pos;
			ttt=task[i].tim;
		 } 
		 if(res>2e9) cout<<"-1"<<endl;
		 else cout<<ans<<endl;
	}
	return 0;
}

上一题