前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Codeforces 967 C 题解报告

Codeforces 967 C 题解报告

作者头像
海天一树
发布2018-07-25 12:28:17
2690
发布2018-07-25 12:28:17
举报
文章被收录于专栏:海天一树

一、题目

http://codeforces.com/contest/967/problem/C

二、思路

(一)如果是同一楼层,则直接走过去,不用爬楼梯也不用乘电梯。 (二)如果是不同楼层,分别计算爬楼梯和乘电梯所用的时间,取最小值。 (1)在计算爬楼梯所用时间时,若起始房间旁边只有一个楼梯,计算从起始房间经过该楼梯到达终点房间所需的时间。 若起始房间旁边有两个或更多的楼梯,要分别计算从离起始房间号最近的左右两边的两个楼梯爬上去到达终点房间所需的时间,再取最小值。 (2)乘电梯的道理与爬楼梯的道理一样。 (3)从(1)和(2)的结果中,取最小值。

三、代码

代码语言:javascript
复制
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
    int n, m, c1, c2, v; //层数,每层section数,楼梯数,电梯数,电梯每单位时间能升降的层数
    scanf("%d %d %d %d %d", &n, &m, &c1, &c2, &v);
    int a[c1], b[c2];
    for(int i = 0; i < c1; i++)
    {
        scanf("%d", &a[i]);
    }
    for(int i = 0; i < c2; i++)
    {
        scanf("%d", &b[i]);
    }
    int q, floor1, room1, floor2, room2; //查询几次,起始房间的层号和房间号,目标房间的层号和房间号
    int updownPos; //楼梯或电梯的位置
    scanf("%d", &q);
    while(q--)
    {
        int ans=1000000000, k; //k表示第几个楼梯或电梯
        scanf("%d %d %d %d", &floor1, &room1, &floor2, &room2);
        if(floor1 == floor2)
        {
            printf("%d\n", abs(room2 - room1));
            continue;
        }
        //爬楼梯,用二分查找法选择爬第几个楼梯
        k = lower_bound(a, a + c1, room1) - a;  
        if(k < c1)
        {
            updownPos = a[k];
            ans = min(ans, abs(updownPos - room1) + abs(floor2 - floor1) + abs(room2 - updownPos));
        }
        if(k > 0)
        {
            updownPos = a[k-1];
            ans = min(ans, abs(updownPos - room1) + abs(floor2 - floor1) + abs(room2 - updownPos));
        }
        //乘电梯,用二分查找法选择乘哪个电梯
        k = lower_bound(b, b + c2, room1) - b;
        if(k < c2)
        {
            updownPos = b[k];
            ans = min(ans, abs(updownPos - room1) + (abs(floor2 - floor1) + v - 1) / v + abs(room2 - updownPos));
        }
        if(k > 0)
        {
            updownPos = b[k - 1];
            ans = min(ans, abs(updownPos - room1) + (abs(floor2 - floor1) + v - 1) / v + abs(room2 - updownPos));
        }
        printf("%d\n", ans);
    }
    return 0;
}

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海天一树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目
  • 二、思路
  • 三、代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档