• LA 6834 Shopping


    题目链接: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;
    }
  • 相关阅读:
    按属性分割要素
    python os.path模块
    用数组显示裴波那契数列
    计算两位数的加减乘除
    输入一串数字统计0到9每个数字的个数
    开辟新空间输入成绩
    关系表达式、条件表达式、逻辑表达式
    变量、函数和程序控制
    哥德巴赫定理
    找出二维数组中最大的值
  • 原文地址:https://www.cnblogs.com/beisong/p/4737619.html
Copyright © 2020-2023  润新知