题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4846
题目大意:街道上等距分布着n个商店,编号为1~n,相邻商店之间距离为单位1,某人从初始位置(0点)出发,要在每个商店里买一些物品,且购物时要满足一些诸如先到商店A,再到商店B的限制条件,最后到达出口(n+1点)。问此人购物要走的路最短是多少(不包括在商店里的路程)。
分析:对于限制条件<a, b>,如果a要在b之后走,且a>b,那么这个限制条件相当于没有,因为不需要走回头路。对于剩下的限制条件,可以看成是一些区间,去掉被覆盖的即可,如下图所示三个区间可以合并成一个区间:L~R。
参考代码:
#include <algorithm> #include <cstdio> using namespace std; #define N 1010 int n, m; struct A{ int l, r; bool operator < (const A tm) const { return l < tm.l; } }a[N], b[N]; int main() { while(~scanf("%d %d", &n, &m)) { int l, r, c = 0; for(int i =0; i < m; i++){ scanf("%d %d", &l, &r); if(l > r) continue; a[c].l = l, a[c++].r = r; } sort(a, a+c); l = a[0].l, r = a[0].r; int t = 0; for(int i = 1; i < c; i++) { if(a[i].l <= r) r = max(r, a[i].r); else { b[t].l = l, b[t++].r = r; l = a[i].l, r = a[i].r; } if(i == c-1) b[t].l = l, b[t++].r = r; } int ans = n+1; for(int i = 0; i < t; i++) ans += 2*(b[i].r-b[i].l); printf("%d ", ans); } return 0; }