美团2018年CodeM大赛-初赛B轮 B 配送

题意

题解

对于每个任务,只要从上个任务的终点出发即可。

时间、地点很少,可以算出每个地点-时间的最小花费。

以题目描述的起点终点起始结束时间建图,很暴力的跑最短路即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define rep(i, a, b) for(int i=(a); i<(b); i++)
#define sz(a) (int)a.size()
#define de(a) cout << #a << " = " << a << endl
#define dd(a) cout << #a << " = " << a << " "
#define all(a) a.begin(), a.end()
#define endl "\n"
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
//--- const int inf = 2e9; int n, m, k;
struct Task {
int pos;
string tim;
bool operator < (const Task &c) const {
return tim < c.tim;
}
}task[11];
struct Edge {
int v, p;
string st, ed;
Edge(int v, int p, string st, string ed) : v(v), p(p), st(st), ed(ed) {}
};
vector<Edge> g[111];
map<string, int> dis[111]; void dij(int pos, string tim) {
rep(i, 1, k+1) dis[i].clear();
dis[pos][tim] = 0;
priority_queue<pair<int, pair<int, string> > > que;
que.push(mp(0, mp(pos, tim)));
while(!que.empty()) {
auto u = que.top(); que.pop();
int d = -u.fi;
pos = u.se.fi; tim = u.se.se;
if(d != dis[pos][tim]) continue;
for(auto i : g[pos]) {
int v = i.v, p = i.p;
int t = dis[pos][tim] + p;
if(tim < i.st && (!dis[v].count(i.ed) || dis[v][i.ed] > t)) {
dis[v][i.ed] = t;
que.push(mp(-t, mp(v, i.ed)));
}
}
}
} int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(0);
cin >> n >> m >> k;
rep(i, 0, n) {
string s1, s2;
cin >> task[i].pos >> s1 >> s2;
task[i].tim = s1 + " " + s2;
}
sort(task, task+n);
rep(i, 0, m) {
int u, v, p;
string st, ed;
cin >> u >> v >> p >> st >> ed;
rep(j, 1, 8) {
string t1 = "2018.07.0" + to_string(j) + " " + st;
string t2 = "2018.07.0" + to_string(j) + " " + ed;
g[u].pb(Edge(v, p, t1, t2));
}
}
int pos = 1, ans = 0;
string tim = "2018.06.30 23:59:59.999";
rep(i, 0, n) {
dij(pos, tim);
int res = inf;
for(auto j : dis[task[i].pos]) {
if(j.fi < task[i].tim) res = min(res, j.se);
else break;
}
if(res == inf) {
ans = inf;
break;
}
ans += res;
pos = task[i].pos;
tim = task[i].tim;
}
if(ans == inf) ans = -1;
cout << ans << endl;
return 0;
}

最新文章

  1. Docker - Docker基础命令及使用
  2. Servlet&amp;jsp基础:第五部分
  3. linux定时执行文件
  4. 项目规范和建立-从frozenui学习
  5. 简单学C——第七天
  6. JavaScript HTML DOM
  7. Oracle函数function
  8. HttpClient(联网)
  9. 初步STL集装箱Vector
  10. 读书笔记 effctive c++ Item 52 如果你实现了placement new,你也要实现placement delete
  11. golang json 读写配置文件
  12. 前端基于easyui的mvc扩展
  13. Spring Boot优化
  14. Webstorm使用教程详解
  15. 随机错乱排序(sort的应用)
  16. 响应式下的雪碧图解决方案 - 活用background-size / background-position
  17. Best Reward HDU - 3613(马拉车+枚举+前缀和)
  18. 已安装 SQL Server 2005 Express 工具。若要继续,请删除 SQL Server 2005 Express 工具
  19. python mysqldb 模块学习
  20. bind的原生代码实现

热门文章

  1. FocusBI:《DW/BI项目管理》之SSIS执行情况
  2. Android OpenGL教程-第六课【转】
  3. Linux du查询文件大小
  4. Spring中使用JMS
  5. [转]Grunt 新手一日入门
  6. C# 之构造函数
  7. 图解源码之java锁的获取和释放(AQS)篇
  8. 网络安全之——DNS欺骗实验
  9. UVA 455(最小周期)
  10. js 数组转json,json转数组