6786. Intersection

6786. Intersection

HDOJ 6786. Intersection


2020 年百度之星·程序设计大赛 - 初赛三

题目:6786. Intersection

问题描述:

Mr. Left 来到了一个路口,这个路口只能右转,并且都是两车道。

现在在南北向车道上有 n 辆车,他们都在线 x 南边,这些车想要通过这个路口,到东边去,具体地说,他们要开到线 y 东边。

一辆车一个时刻可以从东南西北中选一个方向移动一个位置,或者呆在原地不动。 同一时刻同一位置不能有超过一辆车。车不能开到路外面。

在任意时刻,所有车都同时移动。两辆相邻的车不能都移动到对方的格子上。在此基础上,只要所有车移动后不存在两辆车处于同一位置,移动就合法。

问最少要多少时间,这些车才可以都开到东边?

输入:

第一行一个整数 test (1≤test≤10)。
对于每组数据,第一行一个整数 n (1≤n≤100000),表示车辆数目。
接下来 n 行,每行两个整数 x,y 表示车的位置,其中 x 表示车道 id( x=1 表示右车道,x=2 表示左车道),y (1≤y≤100000) 表示车在路口前第几个位置。
数据保证没有两辆车初始在同一位置。

输出:

对于每组数据,一行一个整数表示答案。

样本输入:

2
2
1 1
2 1
2
1 2
2 1

样本输出:

3
4

样例解释:

第一组
time 0
….
….
CC
..
time 1
….
CC..
..
..
time 2
….
.CC.
..
..
time 3
….
..CC
..
..
第二组
time 0
….
….
C.
.C
time 1
….
C…
.C
..
time 2
C…
.C..
..
..
time 3
.C..
..C.
..
..
time 4
..C.
…C
..
..

方法:贪心

思路:只需计算最后一辆车通过的时间即可,根据寻找规律,如果最后一辆车(根据从右到左,从上到下的顺序排)在左车道则全部车通过需要y + 2时间,如果最后一辆车在右车道则全部车通过需要y + 2或者y + 1时间。

当最后一辆车在右车道,倒数第二辆车在其左前方时,由于需要等待或者绕远道,所以此时全部车通过需要y + 2时间,否则只需y + 1时间。

运行数据:执行用时:2823MS,内存消耗:13820K

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int test = sc.nextInt();

while (test-- > 0) {
int n = sc.nextInt();

// 记录最后一辆车和倒数第二辆车的位置
int x1 = 0, y1 = 0;
int x2 = 0, y2 = 0;

// 遍历每一辆车的位置确定最后一辆车和倒数第二辆车的位置
while (n-- > 0) {
int x = sc.nextInt();
int y = sc.nextInt();
if (y >= y2) {
if (x > x2 || y > y2) {
x1 = x2;
y1 = y2;
x2 = x;
y2 = y;
} else {
x1 = x;
y1 = y;
}
} else if (y >= y1) {
x1 = x > x1 ? x : x1;
y1 = y;
}
}

// 根据最后一辆车和倒数第二辆车的位置得出结果
if (x2 == 2 || (x1 == 2 && y1 == (y2 - 1))) {
System.out.println(y2 + 2);
} else {
System.out.println(y2 + 1);
}
}
}
}

学习所得,资料、图片部分来源于网络,如有侵权,请联系本人删除。

才疏学浅,若有错误或不当之处,可批评指正,还请见谅!


Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×