UVALive 6834 Shopping(开箱拿钥匙题型)

Question:
Your friend will enjoy shopping. She will walk through a mall along a straight street, where N individual
shops (numbered from 1 to N) are aligned at regular intervals. Each shop has one door and is located
at the one side of the street. The distances between the doors of the adjacent shops are the same
length, i.e. a unit length. Starting shopping at the entrance of the mall, she visits shops in order to
purchase goods. She has to go to the exit of the mall after shopping.
She requires some restrictions on visiting order of shops. Each of the restrictions indicates that she
shall visit a shop before visiting another shop. For example, when she wants to buy a nice dress before
choosing heels, she shall visit a boutique before visiting a shoe store. When the boutique is farther
than the shoe store, she must pass the shoe store before visiting the boutique, and go back to the shoe
store after visiting the boutique.
If only the order of the visiting shops satisfies all the restrictions, she can visit other shops in any
order she likes.
Write a program to determine the minimum required walking length for her to move from the
entrance to the exit.
Assume that the position of the door of the shop numbered k is k units far from the entrance, where
the position of the exit is N + 1 units far from the entrance.
Input
The input file contains several test cases, each of them as described below.
Each case input consists of a set of lines.
N m
c1 d1
.
.
.
cm dm
The first line contains two integers N and m, where N (1 ≤ N ≤ 1000) is the number of shops, and
m (0 ≤ m ≤ 500) is the number of restrictions. Each of the next m lines contains two integers ci and
di (1 ≤ ci < di ≤ N) indicating the i-th restriction on the visiting order, where she must visit the shop
numbered ci after she visits the shop numbered di (i = 1, … , m).
There are no pair of j and k that satisfy cj = ck and dj = dk.
Output
For each test case, output the minimum required walking length for her to move from the entrance to
the exit. You should omit the length of her walk in the insides of shops.
Sample Input
10 3
3 7
8 9
2 5
10 3
8 9
6 7
2 4
10 0
10 6
6 7
4 5
2 5
6 9
3 5
6 8
1000 8
3 4
6 1000
5 1000
7 1000
8 1000
4 1000
9 1000
1 2
Sample Output
23
19
11
23
2997
题目大意:一条街上有n个商店,一个人购物,但他购物有限制必须先去一些商店才能去另外的一些商店,问最短需要走多少路程
解题思路:如果一个商店必须先走的商店比它小就可忽略不计。先按第一个数升序排序,再依次遍历,把可以合并的区间合并,直至不能合并,则先到这个点后返回最小的那个点
(http://acm.hust.edu.cn/vjudge/contest/130408#problem/C)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=1005;
struct node
{
    int s,d;
}a[MAXN];
bool cmp(node x,node y)
{
    return x.s<y.s;
}
int main()
{
    int n,m,t;
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=0;i<MAXN;i++)
            a[i].d=a[i].s=0;
        int cnt=0,res=0,t=0;
        for(int i=0;i<m;i++)
        {
            int tp1,tp2;
            scanf("%d%d",&tp1,&tp2);
            if(tp1<tp2)        //如果先走小的再走大的就可以忽略
            {
                a[cnt].s=tp1;
                a[cnt++].d=tp2;
            }
        }
        sort(a,a+cnt,cmp);
        int l=a[0].s,r=a[0].d;
        for(int i=1;i<cnt;i++)
        {
            if(a[i].s<=r)
                r=max(r,a[i].d);   //区间合并,有交集的区间合并为一个
            else
            {
                res+=(r-t+2*(r-l));
                t=r;
                l=a[i].s;
                r=a[i].d;
            }
        }
        res+=(n+1-t+2*(r-l));
        printf("%d\n",res);
    }
}

体会:这道题是以开箱取钥匙为原型,还用到了区间合并

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值