hp와 dp를 가진 N개 캐릭터와 기준값 C가 주어질 때 순서에 따라 결과가 달라지는 표적 선택 함수가 반환할 수 있는 캐릭터 수를 셉니다.
보통7정렬그래프그리디아직 제출이 없습니다시간 제한2초메모리 제한256 MB아오바는 게임 회사에 갓 들어온 프로그래머다. 새 게임에서 적 AI(인공지능)가 쓸 전투 전략을 만드는 일을 맡았다. 이 게임에서는 캐릭터마다 체력 hp와 방어력 dp가 있고, hp와 dp가 동시에 같은 캐릭터는 없다. 플레이어는 캐릭터를 한 명 이상 골라 파티를 만들고 적과 싸운다.
아오바는 AI가 파티에서 가장 약한 캐릭터를 공격하도록 전략을 짰다. 즉 hp가 가장 작은 캐릭터를 공격하고, 그런 캐릭터가 여럿이면 그중 dp가 가장 작은 캐릭터를 공격한다. 파티를 나타내는 배열을 받아 AI가 공격할 캐릭터를 돌려주는 함수 selectTarget(v)를 그렇게 작성했다.
그런데 프로젝트 매니저 야가미는 이 AI가 재미없다며 마음에 들어 하지 않았다. 아오바는 한참 헤맨 끝에 프로그램에 있던 상수 0 하나를 상수 C로 바꾸면 재미있어진다는 사실을 알아냈다. 고쳐 쓴 프로그램은 다음과 같다. Character는 캐릭터를 나타내는 자료형이고, 필드 hp와 dp는 각각 체력과 방어력이다.
int C = <constant integer>;
Character selectTarget(Character v[]) {
int n = length(v);
int r = 0;
for (int i = 1; i < n; i++) {
if (abs(v[r].hp - v[i].hp) > C) {
if (v[r].hp > v[i].hp) r = i;
} else {
if (v[r].dp > v[i].dp) r = i;
}
}
return v[r];
}
이 함수는 v에 담긴 캐릭터 집합이 같아도 배열에 놓인 순서에 따라 다른 캐릭터를 돌려주기도 한다. 야가미는 새 AI의 공격 대상이 될 수 있는 캐릭터가 몇 명인지 알고 싶어 한다. 파티 v와 상수 C가 주어질 때, v의 순서를 마음대로 바꿨을 때 selectTarget(v)의 반환값이 될 수 있는 캐릭터의 수를 세는 프로그램을 작성하라.
입력은 테스트 케이스 하나로 이루어진다. 첫 줄에 정수 N과 C가 주어진다 (1≤N≤50000, 0≤C≤109). N은 v의 크기이고, C는 프로그램 속 상수 C다. 이어지는 N개 줄 중 i번째 줄에는 정수 hpi와 dpi가 주어진다 (0≤hpi,dpi≤109). hpi는 v의 i번째 캐릭터의 체력이고, dpi는 방어력이다. i=j이면 hpi=hpj이거나 dpi=dpj이다.
v의 순서를 임의로 바꿨을 때 selectTarget(v)의 반환값이 될 수 있는 캐릭터의 수를 한 줄에 출력한다.