题意:给你一排商店 ,再给你一些依赖关系(ai,bi 表示 访问ai 之前一定要访问 bi ),问你从进口到出口 访问所有的店铺的最短距离是多少。
解题思路:把ai,bi 看成一条线段,如果有互相覆盖的就合并。有线段覆盖的地方 ×2 + 所有商店总长度就是我们需要的解。
解题代码:
1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月25日 星期三 13时17分06秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 struct node{ 28 int l , r; 29 } a[1005]; 30 int cmp(node a ,node b) 31 { 32 return a.l < b.l ; 33 } 34 int main(){ 35 int n , m; 36 scanf("%d %d",&n,&m); 37 for(int i =1;i <= m;i ++) 38 { 39 scanf("%d %d",&a[i].l,&a[i].r); 40 } 41 int tl = 0 ; 42 int tr = 0 ; 43 sort(a+1,a+1+m,cmp); 44 int sum = n + 1; 45 for(int i = 1;i <= m;i ++) 46 { 47 if(a[i].l <= tr) 48 { 49 tr = max(a[i].r,tr); 50 }else{ 51 //printf("%d %d\n",tl,tr); 52 sum += (tr-tl)*2; 53 tl = a[i].l ; 54 tr = a[i].r; 55 } 56 } 57 sum += (tr-tl)*2; 58 printf("%d\n",sum); 59 return 0; 60 }