一、题目
http://codeforces.com/contest/967/problem/C
二、思路
(一)如果是同一楼层,则直接走过去,不用爬楼梯也不用乘电梯。
(二)如果是不同楼层,分别计算爬楼梯和乘电梯所用的时间,取最小值。
(1)在计算爬楼梯所用时间时,若起始房间旁边只有一个楼梯,计算从起始房间经过该楼梯到达终点房间所需的时间。
若起始房间旁边有两个或更多的楼梯,要分别计算从离起始房间号最近的左右两边的两个楼梯爬上去到达终点房间所需的时间,再取最小值。
(2)乘电梯的道理与爬楼梯的道理一样。
(3)从(1)和(2)的结果中,取最小值。
三、代码
#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;
}
TopCoder & Codeforces & AtCoder交流QQ群:648202993
更多内容请关注微信公众号
wechat_public.jpg
网友评论