题目

源地址:

http://codeforces.com/problemset/problem/14/B

理解

一个摄影师要拍摄运动员比赛的照片,然后给定摄影师的坐标,以及每一位运动员的活动范围。要求计算出摄影是需要活动的最小步数。 首先我们需要对输入的数据进行一次处理,也就是必须保证左端比右段小。处理完毕之后,两端分别进行sort,这样就得到了运动员活动范围的起点和终点的有序列。显然,只有当最大的起点比最小的终点还小的时候,摄影师才有可能同时看到。然后,如果当前摄影师的坐标比最大的起点小,他只要移动到最大起点即可;如果当前摄影师的坐标比最小的终点大,他就需要移动到最小终点。 这样,我们就得到了摄影师需要移动的距离。

代码


#define MAXN 1000+10

int a[MAXN],b[MAXN];
int n,i,j,x;

void init()
{
    scanf("%d%d",&n,&x);
    for(i=0; i<n; i++)
    {
        scanf("%d%d",&a[i],&b[i]);
        if(a[i]>b[i])
        {
            j=a[i];
            a[i]=b[i];
            b[i]=j;
        }
    }
    sort(a,a+n);
    sort(b,b+n);
}

int main(int argc, char const *argv[])
{
    init();
    if(a[n-1]<=b[0])
    {
        if(x<a[n-1])
            printf("%d\n",a[n-1]-x);
        else if(x>b[0])
            printf("%d\n",x-b[0]);
        else puts("0");
    }
    else
        puts("-1");
    return 0;
}

更新日志

  • 2014年11月21日 已AC。