Amazing Long Jump

시간 제한1초메모리 제한1024 MB

요약
대시, 버프, 공격, 아이템 모션을 포함한 점프 물리를 프레임마다 계산해 착지 시점의 x 좌표를 출력한다.
난이도

보통10점 중 5점

유형
시뮬레이션, 구현
정답자
아직 제출이 없습니다

문제

스타가 즐겨하는 게임에서 이벤트로 멀리뛰기 미니게임을 출시했다. 미니게임에 과몰입하던 스타는 프레임마다 입력되는 커맨드가 주어질 때 예상 기록을 계산해 보려고 한다. 다음 명세를 보고 프레임마다 커맨드 입력 여부 및 입력한 커맨드의 종류가 주어질 때 멀리뛰기 기록을 계산해 주는 프로그램을 만들어 보자.

먼저 플레이어의 능력치는 아래와 같다.

  • base_x\text{base}\_x: 플레이어의 기본 xx축 속도이다.

  • jump\text{jump}: 플레이어의 점프력이다.

  • dash\text{dash}: 플레이어의 대시 상태를 표현하는 값이다.

    • dash>0\text{dash} > 0이면 대시 상태이고 dash=0\text{dash} = 0이면 대시 상태가 아니다. 대시 상태 동안에는 중력의 영향을 받지 않으며 이동, 공격, 버프 스킬 및 소비 아이템을 사용할 수 없다.
    • dash>0\text{dash} > 0이면 22프레임 간격으로 dash\text{dash}가 11만큼 감소한다. 다시 말해 어떤 프레임에서 dash\text{dash}가 변했고 dash>0\text{dash} > 0이라면 22프레임 뒤에 dash\text{dash}를 11 감소한다.
  • quick\text{quick}: 퀵 드롭 상태이면 11 아니면 00이다.

  • accel\text{accel}: 가속 상태이면 11 아니면 00이다.

  • weak\text{weak}: 중력 약화 상태면 11 아니면 00이다.

  • maxdrop\text{maxdrop} : 플레이어의 최대 낙하 속도다.

  • motion\text{motion}: 플레이어가 아이템 사용모션을 취하고 있는 상태면 11 아니면 00이다.

    • 사용모션을 취하고 있는 상태면 해당 프레임에서는 이동, 공격, 버프 스킬 및 소비 아이템을 사용할 수 없고 중력의 영향을 받지 않는다.

그 외 게임과 관련된 정보는 아래와 같다.

  • base_g\text{base}\_g: 기본 중력 크기이다.
  • init_y\text{init}\_y: 플레이어가 처음에 시작하는 yy좌표이다.

미니게임에서는 이동 스킬, 공격 스킬, 버프 스킬 그리고 소비 아이템을 사용할 수 있다. 각 스킬과 아이템에 대한 명세는 다음과 같다.

  • 이동 스킬

    • 대시

      • 사용 시 dash=5\text{dash} = 5, yy축 속도는 00이 된다.
    • 에어 점프

      • 사용 시 플레이어의 yy축 속도가 jump\text{jump}가 된다.
    • 퀵 드롭

      • 사용 시 플레이어는 퀵 드롭 상태가 되며, yy축 속도가 −maxdrop-\text{maxdrop}가 된다.
      • 퀵 드롭 상태에서 대시, 수평 대시 공격, 우상향 대시 공격, 소비 아이템을 사용하면 그 즉시 퀵 드롭 상태는 해제된다.
  • 공격 스킬

    • 회전 공격

      • 사용 시 플레이어는 회전 상태가 된다.
      • 회전 상태에서 yy좌표가 00이면 yy축 속도가 현재 yy축 속도의 −1-1배가 되며 회전 상태는 해제된다.
      • 회전 상태에서 다른 이동 스킬이나 공격 스킬, 버프 스킬 및 소비 아이템을 사용하면 그 즉시 회전 상태는 해제된다.
      • 해당 스킬은 게임이 시작되고 착지할 때까지 단 한 번만 사용할 수 있다.
    • 수평 대시 공격

      • 사용 시 dash=5\text{dash} = 5, yy축 속도는 00이 된다.
    • 우상향 대시 공격

      • 사용 시 dash=5\text{dash} = 5가 되며 플레이어의 yy축 속도는 xx축 속도에 의존하는 상태가 된다.
      • dash\text{dash}가 00이 되는 순간 yy축 속도는 xx축 속도에 의존하지 않는다.
  • 버프 스킬

    • 가속

      • 사용 시 플레이어는 가속 상태가 된다.
      • 지속 시간은 600600프레임이며 사용 시점으로부터 600600프레임이 지난 직후 가속 상태는 해제된다.
      • 가속 상태 중에 중복하여 사용하면 마지막으로 사용한 프레임으로부터 600600프레임 이후에 해제된다.
    • 중력 약화

      • 사용 시 플레이어는 중력 약화 상태가 된다.
      • 지속 시간은 600600프레임이며 사용 시점으로부터 600600프레임이 지난 직후 중력 약화 상태는 해제된다.
      • 중력 약화 상태 중에 중복하여 사용하면 마지막으로 사용한 프레임으로부터 600600프레임 이후에 해제된다.
  • 소비 아이템

    • 폭탄

      • 사용 시 yy축 속도는 00이 되며 사용 모션이 시작된다.
      • 사용 모션의 지속 시간은 100100프레임이다.
    • 쉴드

      • 사용 시 yy축 속도는 00이 되며 사용 모션이 시작된다.
      • 사용 모션의 지속 시간은 3030프레임이다.
    • 포션

      • 사용 시 yy축 속도는 00이 되며 사용 모션이 시작된다.
      • 사용 모션의 지속 시간은 150150프레임이다.

미니게임은 프레임마다 아래 과정들을 순서대로 실행한다.

  1. 착지 상태인지 판단한다. 착지 상태란 플레이어의 yy좌표가 00이면서 회전 상태가 아닌 상태이다. 착지 상태라면 게임을 종료한다.

  2. 플레이어의 일부 능력치를 변경한다. 해당 단계에서 변경되는 능력치는 다음과 같다.

    • 해당 프레임에서 yy좌표가 00이면서 회전 상태라면 해당 단계에서 yy축 속도가 변경되고 회전 상태를 해제한다.
    • 해당 프레임에서 dash\text{dash}가 11 감소해야 한다면 감소한다.
    • 해당 프레임에서 버프와 아이템 사용 모션을 해제해야 한다면 해제한다.
  3. 입력된 커맨드를 적용한다. 만약에 현재 프레임에서 사용할 수 없는 스킬이나 아이템에 대한 커맨드라면 적용하지 않고 무시한다.

  4. xx축 방향으로 이동한다. 플레이어의 xx축 속도만큼 xx좌표가 증가하며 xx축 속도 v_xv\_x는 아래와 같이 계산한다.

v_x=(1+dash+5⋅quick)⋅(1+accel)⋅base_x⋅(1−motion)v\_x = (1+\text{dash}+5 \cdot \text{quick}) \cdot (1+\text{accel}) \cdot \text{base}\_x \cdot (1-\text{motion})

  1. yy축 방향으로 이동한다. 플레이어의 yy축 속도만큼 yy좌표가 증가하며 만약에 yy좌표가 00이하가 된다면 yy좌표는 00이 된다. 이때, yy축 속도가 xx축 속도에 의존하는 상태라면 이전 단계에서 계산한 xx축 속도로 yy축 속도를 변경해 준 뒤 이동한다.
  2. 해당 프레임에서 중력의 영향을 받는다면 중력을 적용한다. 현재 중력의 크기를 gg, 변화 전 yy축 속도를 v_yv\_y라고 하면 변화 후 yy축 속도 v′_y=max⁡(−maxdrop,v_y−g)v'\_y = \max(-\text{maxdrop}, v\_y-g)이다. 현재 중력의 크기 gg는 아래와 같이 계산한다.

g=⌊base_g1+weak⌋g = \left\lfloor \frac{\text{base}\_g}{1+\text{weak}} \right\rfloor

플레이어는 처음에 (0,init_y)(0, \text{init}\_y)에서 yy축 속도는 jump\text{jump}로 시작한다. 플레이어가 착지한 위치가 (X,0)(X, 0)이라면 멀리뛰기 기록은 XX가 된다.

입력

첫째 줄에는 플레이어의 능력치 중 base_x,jump,maxdrop\text{base}\_x, \text{jump}, \text{maxdrop}이 공백으로 구분되어 주어진다. (1≤base_x≤100;1≤jump≤100;1≤maxdrop≤10,000)(1 \leq \text{base}\_x \leq 100; 1 \leq \text{jump} \leq 100; 1 \leq \text{maxdrop} \leq 10\\,000)

둘째 줄에는 게임과 관련된 정보 중 base_g,init_y\text{base}\_g, \text{init}\_y가 공백으로 구분되어 주어진다. (1≤base_g≤100;1≤init_y≤100,000)(1 \leq \text{base}\_g \leq 100; 1 \leq \text{init}\_y \leq 100\\,000)

셋째 줄에는 커맨드 입력 여부 및 입력된 커맨드가 주어지는 프레임의 수 NN이 주어진다. (1≤N≤1,000,000)(1 \leq N \leq 1\\,000\\,000)

넷째 줄부터 NN개의 줄에는 커맨드 입력 여부 및 입력된 커맨드의 종류가 한 줄에 한 프레임씩 주어진다. d는 대시, aj는 에어 점프, qd는 퀵 드롭, ra는 회전 공격, hda는 수평 대시 공격, ruda는 우상향 대시 공격, acc는 가속 버프, gw는 중력 약화 버프, bomb는 폭탄, shield는 쉴드, potion는 포션 커맨드를 사용했음을 의미하며, none은 어떠한 커맨드도 입력하지 않았음을 의미한다.

출력

플레이어의 멀리뛰기 기록을 출력한다.

주어진 NN개의 프레임 이후에는 커맨드가 입력되지 않으며 착지 상태가 아닌 경우 착지 상태가 될 때까지 게임은 계속 진행됨에 유의한다.

예제3

  1. 예제 1

    입력
    39 52 88
    8 46
    5
    qd
    d
    bomb
    aj
    d
    
    예상 출력
    234
    
  2. 예제 2

    입력
    59 96 34
    8 8
    2
    ra
    d
    
    예상 출력
    2773
    
  3. 예제 3

    입력
    87 37 91
    9 58
    5
    ra
    bomb
    gw
    aj
    hda
    
    예상 출력
    609