2024. 3. 13. 00:13ㆍPlatinum/Platinum I
1을 타패하고 33을 또이쯔로 쓰겠다.
며칠 전 대회인 제4회 MatKor의 H번 문제이다. 총 16문제짜리 셋이었으니, 이 뒤로 이것보다 어려운 문제가 8개나 있다는 뜻이다. 이 문제 난이도도 절대 만만하지 않다! 본대회에서 식 정리하는 데만 20분을 넘게 썼다.
내 영역이라서 그나마 빠르게 풀기는 했는데, 그 빠르게 푼다는 게 40분 조금 넘게 걸렸던 문제다. 쏟은 시간 보고 제법 만만치 않으리라고 생각했는데 설마 Platinum I이었을 줄은...
그럼 본격적으로 풀이에 돌입해 보자.
문제
2024년 3월 9일 제4회 MatKor Cup이 개최된다. 이번 MatKor Cup에는 총
이번 대회 운영진인 준혁이는 어떤 참가자가 우승할 지에 대해 자신을 제외한 운영진끼리 베팅을 하도록 했다. 베팅 결과 ‘
도박을 싫어해 베팅에 참여하지 않은 종우는 자신이 공평하게 배당을 나눌 수 있다고 말했다. 그 결과, 종우가 배당을 정하기로 했다.
만약
종우는 준혁이가 도박 운영을 통해 돈을 버는 것을 못마땅하게 생각해 준혁이가 최대한 돈을 벌지 못하게 하고 싶다. 참가자별로 걸린 금액과 배당 상수가 주어질 때 종우를 도와 준혁이가 버는 금액의 기댓값이 최소가 되도록 배당을 조정해 보자.
입력
첫 번째 줄에 대회 참가자의 수
두 번째 줄에 베팅 결과 각 참가자에게 걸린 금액을 나타내는
주어지는 입력은
예제 입력)
# 예제 입력 1
1 1 1
10
# 예제 입력 2
2 2 2
1 1
# 예제 입력 3
2 2 2
0 10
# 예제 입력 4
2 1 3
4 5
# 예제 입력 5
2 2 6
1 1
# 예제 입력 6
4 3 123456
999 987 975 951
출력
준혁이가 버는 금액의 기댓값의 최솟값을 출력한다. 이 값이 음수일 수 있음에 유의하자.
정답과의 절대오차 또는 상대오차가
예제 출력)
# 예제 출력 1
0
# 예제 출력 2
1
# 예제 출력 3
-4.1421356237
# 예제 출력 4
0.6666666667
# 예제 출력 5
0.2679491924
# 예제 출력 6
-26785.85891
내 코드
n,m,t = map(int,input().split())
a = list(map(int,input().split())); s = sum(a)
if n == 1:
print(a[0]-a[0]*pow(t,1/m))
exit(0)
if m == 1:
print(s-t*max(a)**2/s); exit(0)
p = [i/s for i in a]
u,v = 2*m/(m-1),(m-1)/m
alpha = sum(pow(i,u) for i in p)/t
alpha = pow(alpha,v)
print(s*(1-t*alpha))
일단 풀이과정에 들어가기 전에 식을 어떻게 변형시켜야 할지 알아보자.
후자는 횔더 부등식(Hölder Inequality)를 쓴다. 수학 전공자라도 저학년이면 볼 일이 없을 것이고, 전공자가 아니라면 더더욱 볼 일이 없는 완전한 사전지식의 영역이다. 본래는 가측함수의 적분값에서 쓰이는데, 수열에서도 사용 가능하다. 두 양수
계산하는 데 필요한 모든 값이 주어져 있으므로
그런데 횔더 부등식을 외우고 있는 사람은 많지 않을 뿐더러 저 상황에서 횔더 부등식이 생각나서 그대로 풀 수 있는 사람이 몇 명이나 될까. 난 없으리라 본다. 대신 이공계 대학생에게 조금이나마 더 익숙할 기법을 사용할 것이다. 라그랑주 승수법이다.
함수
따라서
게다가
실수 오차는 생각보다 관대한 편이고, 파이썬으로 푼다면 실수 오차에 당하지 않기 위해 decimal을 꺼내는 순간 시간초과에 막히게 된다. 그냥 정직하게 풀어도 통과한다. 내가 그랬다.
이로서 31540번의 풀이를 마친다.

'Platinum > Platinum I' 카테고리의 다른 글
BOJ 5615 - 아파트 임대 (Python3) (0) | 2022.12.04 |
---|