1
+ import java .util .ArrayDeque ;
2
+ import java .util .Deque ;
3
+
4
+ public class JW_30407 {
5
+
6
+ public static void main (String [] args ) throws Exception {
7
+ int n = read ();
8
+ Deque <int []> dq = new ArrayDeque <>();
9
+ int h = read (), d = read (), k = read ();
10
+ dq .offer (new int [] { h , d , 1 , 0 });
11
+ int t = 0 , damage = 0 , tempDamage = 0 ;
12
+ while (n -- > 0 ) {
13
+ t = dq .size ();
14
+ tempDamage = read ();
15
+ while (t -- > 0 ) {
16
+ int [] cur = dq .poll ();
17
+ damage = Math .max (0 , tempDamage - cur [1 ]); // 받을 데미지
18
+ // 현재 체력이 0 이하라면 건너뛰기
19
+ if (cur [0 ] <= 0 )
20
+ continue ;
21
+ // 깜짝 놀래켰었다면
22
+ if (cur [3 ] == 1 ) {
23
+ cur [3 ] = 0 ;
24
+ damage = 0 ;
25
+ }
26
+ // 깜짝 놀래킬 수 있다면
27
+ if (cur [2 ] != 0 )
28
+ dq .offer (new int [] { cur [0 ] - damage , cur [1 ], 0 , 1 });
29
+ dq .offer (new int [] { cur [0 ] - Math .max (0 , damage - k ), cur [1 ] + k , cur [2 ], cur [3 ] });
30
+ dq .offer (new int [] { cur [0 ] - damage / 2 , cur [1 ], cur [2 ], cur [3 ] });
31
+ }
32
+ }
33
+ // 최댓값 갱신
34
+ int maxH = 0 ;
35
+ while (!dq .isEmpty ()) {
36
+ int [] cur = dq .poll ();
37
+ if (cur [0 ] <= 0 )
38
+ continue ;
39
+ maxH = Math .max (maxH , cur [0 ]);
40
+ }
41
+ System .out .println (maxH != 0 ? maxH : -1 );
42
+ }
43
+
44
+ private static int read () throws Exception {
45
+ int c , n = System .in .read () & 15 ;
46
+ while ((c = System .in .read ()) >= 48 )
47
+ n = (n << 3 ) + (n << 1 ) + (c & 15 );
48
+ if (c == 13 )
49
+ System .in .read ();
50
+ return n ;
51
+ }
52
+ }
0 commit comments