대결
시간 제한1초메모리 제한1024 MB
선수들을 연속한 라운드로 나누고 라운드마다 순서대로 가중치를 곱해 1번 팀에서 0번 팀을 뺀 점수를 최대화하며, 그때 라운드 수를 최소로 한다.
문제
명의 선수가 0번 팀과 1번 팀으로 나누어 대결을 한다. 번 선수는 번 팀에 속해있으며, 능력치는 이다. (단, 는 0 또는 1)
대결의 진행자인 당신은 대결을 여러 라운드에 걸쳐 진행하려고 한다. 당신은 개 이상 개 이하의 라운드를 자유롭게 만든 뒤, 아래 규칙에 따라 라운드에 참가할 선수를 선택해야 한다.
- 각 라운드에는 연속된 번호의 선수들만 참가할 수 있다.
- 모든 선수는 정확히 하나의 라운드에 참가해야 한다.
- 모든 라운드는 한 명 이상의 선수가 참가해야 한다.
예를 들어, 와 같이 라운드를 구성할 수 있지만, 와 같이 불연속적인 번호의 선수들로 라운드를 구성하거나, 와 같이 한 선수가 0개 또는 2개 이상의 라운드에 참가하도록 라운드를 구성할 수 없다.
대결에서 각 팀의 점수는 다음과 같이 계산한다.
- 참가하는 선수의 번호가 작은 라운드부터 차례대로 번째 라운드라고 하자.
- 번째 라운드의 점수는 해당 라운드에 참가한 팀 소속 선수들의 능력치의 합에 를 곱한 값이다.
- 팀의 최종 점수는 해당 팀이 모든 라운드에서 얻은 점수의 총합이다.
예를 들어, , 이고, 라운드를 로 구성했다고 하자. 0번 팀은 2 라운드에서 점, 3 라운드에서 점을 획득해서 최종 점수는 18점이고, 1번 팀은 1 라운드에서 , 3 라운드에서 점을 획득해 최종 점수는 18점이다.
1번 팀의 열렬한 팬인 당신은 1번 팀의 최종 점수에서 0번 팀의 최종 점수를 뺀 값 를 최대화하려고 한다. 만약 를 최대화하는 라운드 구성 방법이 여러가지라면, 라운드 개수 이 최소가 되도록 라운드를 구성해야 한다.
만들 수 있는 최대 점수 차이 와, 이를 달성하기 위한 가장 적은 라운드의 개수 을 구하는 프로그램을 작성해 보자.
입력
첫째 줄에 선수의 수를 의미하는 정수 이 주어진다.
둘째 줄에 각 선수의 소속 팀을 나타내는 개의 정수 이 공백으로 구분되어 주어진다.
셋째 줄에 각 선수의 능력치를 나타내는 개의 정수 이 공백으로 구분되어 주어진다.
출력
1번 팀의 최종 점수에서 0번 팀의 최종 점수를 뺀 값이 최대가 되도록 하는 최소 라운드 개수 과 그때의 최대 점수 차 를 공백으로 구분해서 출력한다.
제한
- ()
- ()
- 입력으로 주어지는 수는 모두 정수이다.
힌트
정답이 32비트 정수 범위를 넘을 수 있으므로, C/C++에서는 long long, Java에서는 long과 같은 자료형을 사용하는 것을 권장한다.