码迷,mamicode.com
首页 > 其他好文 > 详细

LA 6834 Shopping

时间:2015-08-17 21:24:47      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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\n", ans);
    }
    return 0;
}

 

LA 6834 Shopping

标签:

原文地址:http://www.cnblogs.com/beisong/p/4737619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!