New Building for SIS

Codeforces Round #503 (by SIS, Div. 2)
A. New Building for SIS
题意:从一个塔的某一层到另一个塔的某一层,需要的最短时间。条件:每上下一层都要一秒,每从一个塔去临近的塔需要一秒,每个塔去临近的塔只有a-b层有通道去。
思路:分类讨论一下。
1、当出发地和目的地是同一个塔:abs(fa-fb)
2.1、当出发地和目的地不同塔:但是有一个在有通道范围内,或者两者都不在范围内但一个<=a一个>=b:abs(ta-tb)+abs(fa-fb)
2.2、当出发和目的地楼层都<=a:abs(ta-tb)+abs(fa-a)+abs(fb-a)
2.3、当出发地和目的地楼层都>=b:abs(ta-tb)+abs(fa-b)+abs(fb-b)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<stdlib.h>
#include<cmath>
using namespace std;
int main()
{
    int n,h,a,b,k;
    int ta,fa,tb,fb;
    while(scanf("%d%d%d%d%d",&n,&h,&a,&b,&k)!=EOF)
    {
        while(k--)
        {
            scanf("%d%d%d%d",&ta,&fa,&tb,&fb);
            if(ta==tb)
            {
                printf("%d\n",abs(fa-fb));
            }
            else
            {
                int ans=0;ans+=abs(ta-tb);
                if((fa>=a&&fa<=b)||(fb>=a&&fb<=b)||(fa<=a&&fb>=b)||(fa>=b&&fb<=a))
                {
                    ans+=abs(fa-fb);
                    printf("%d\n",ans);
                }
                else if(fa<=a&&fb<=a)
                {
                   ans+=abs(fa-a)+abs(fb-a);
                   printf("%d\n",ans);
                }
                else if(fa>=b&&fb>=b)
                {
                    ans+=abs(fa-b)+abs(fb-b);
                    printf("%d\n",ans);
                }
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Miranda_ymz/article/details/81603271
new