다음 Google 코드 잼 1C 질문을 고려하십시오 .
만리 장성은 무한 선으로 시작하여 모든 위치의 높이가 입니다.
일부 부족 , N ≤ 1000 은 시작일, D , 시작 강도 S , 시작 서쪽 좌표 W 및 시작 동쪽 좌표 E 에 따라 다음과 같은 매개 변수에 따라 벽을 공격합니다 . 이 첫 번째 공격은 D 일, 범위 [ W , E ] 에서 강도 S에서 발생 합니다. [ W , E ] 내에 높이 < S 인 만리장성의 부분이있는 경우, 공격이 성공하고 하루가 끝날 때, 높이 < S 의 내에있는 벽의 세그먼트가 높이 S (또는 다른 공격 인 경우)보다 커지 도록 벽이 쌓입니다. 그날은 힘 S ' > S 와 같은 세그먼트에 부딪쳤다 )
각 부족은 퇴각하기 전에 최대 공격 을 수행 하며 각 공격은 이전 공격에서 반복적으로 결정됩니다. 모든 부족은 일부가 δ의 D , δ X 및 δ S 공격을 자신의 순서를 결정하십시오 기다립니다 δ D ≥ 1 , 그들의 공격 범위 이동 공격 사이의 일 δ X 각 공격 유닛 (음 = 서쪽, 긍정적 =을 범위)의 크기는 동일하게 유지되지만 각 공격 후에는 강도가 일정한 값만큼 증가 / 감소합니다.
문제의 목표는 공격 부족에 대한 완전한 설명이 주어지면 공격의 성공 횟수를 결정하는 것입니다.
나는 약 20 초 안에 작동하는 솔루션을 코딩 할 수있었습니다. 구현 한 솔루션에 시간이 걸립니다 .A = 시뮬레이션의 총 공격 수 (max 1000000 ), X = 공격 범위의 총 고유 에지 포인트 수 (max 2000000 ).
높은 수준에서 내 솔루션 :
- 모든 부족 정보를 읽습니다.
- 공격 범위에 대한 모든 고유 한 좌표를 계산합니다 -O ( A )
- 모든 부족이 수행 할 모든 공격을 생성하고 별로 정렬합니다.