Codeforces 967 C 题解报告

太过爱你忘了你带给我的痛 2022-05-26 10:53 252阅读 0赞

一、题目

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

二、思路

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

三、代码

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. using namespace std;
  5. int main()
  6. {
  7. int n, m, c1, c2, v; //层数,每层section数,楼梯数,电梯数,电梯每单位时间能升降的层数
  8. scanf("%d %d %d %d %d", &n, &m, &c1, &c2, &v);
  9. int a[c1], b[c2];
  10. for(int i = 0; i < c1; i++)
  11. {
  12. scanf("%d", &a[i]);
  13. }
  14. for(int i = 0; i < c2; i++)
  15. {
  16. scanf("%d", &b[i]);
  17. }
  18. int q, floor1, room1, floor2, room2; //查询几次,起始房间的层号和房间号,目标房间的层号和房间号
  19. int updownPos; //楼梯或电梯的位置
  20. scanf("%d", &q);
  21. while(q--)
  22. {
  23. int ans=1000000000, k; //k表示第几个楼梯或电梯
  24. scanf("%d %d %d %d", &floor1, &room1, &floor2, &room2);
  25. if(floor1 == floor2)
  26. {
  27. printf("%d\n", abs(room2 - room1));
  28. continue;
  29. }
  30. //爬楼梯,用二分查找法选择爬第几个楼梯
  31. k = lower_bound(a, a + c1, room1) - a;
  32. if(k < c1)
  33. {
  34. updownPos = a[k];
  35. ans = min(ans, abs(updownPos - room1) + abs(floor2 - floor1) + abs(room2 - updownPos));
  36. }
  37. if(k > 0)
  38. {
  39. updownPos = a[k-1];
  40. ans = min(ans, abs(updownPos - room1) + abs(floor2 - floor1) + abs(room2 - updownPos));
  41. }
  42. //乘电梯,用二分查找法选择乘哪个电梯
  43. k = lower_bound(b, b + c2, room1) - b;
  44. if(k < c2)
  45. {
  46. updownPos = b[k];
  47. ans = min(ans, abs(updownPos - room1) + (abs(floor2 - floor1) + v - 1) / v + abs(room2 - updownPos));
  48. }
  49. if(k > 0)
  50. {
  51. updownPos = b[k - 1];
  52. ans = min(ans, abs(updownPos - room1) + (abs(floor2 - floor1) + v - 1) / v + abs(room2 - updownPos));
  53. }
  54. printf("%d\n", ans);
  55. }
  56. return 0;
  57. }

TopCoder & Codeforces & AtCoder交流QQ群:648202993
更多内容请关注微信公众号
wechat\_public.jpg

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读