728x90
SMALL
import sys; input=sys.stdin.readline
for _ in range(int(input())):
answer = 0
n, m, k, d = map(int, input().split())
B = 1
while True:
A = B * k
temp = n * (m * (m-1) // 2) * A + n * m * (n-1) * m * B // 2
if temp <= d:
answer = max(answer, temp)
B += 1
else:
break
print(-1 if not answer else answer)
- 첫 시도에서는 math.comb()를 이용하여 풀려고 했으나, while문 내에서 comb()를 계속 돌리는 것이 시간 제약에 걸렸습니다.
- 해서 comb()가 아닌 직접 조합식을 세워 각 팀마다 경기 수를 계산하여 최댓값을 갱신하였습니다.
- 갱신이 되지 않는 즉, answer가 0인 경우로 while문을 빠져나왔을 경우에만 "-1"을 출력해주었습니다.
728x90
LIST
'알고리즘 문제 > 랜덤 마라톤 (solved.ac)' 카테고리의 다른 글
🥈 13413번: 오셀로 재배치 (0) | 2024.08.05 |
---|---|
🥈 30980번: 여중생 파댕이와 공부를 (0) | 2024.07.29 |
🥉 5586번: JOI와 IOI (1) | 2024.07.25 |
🥈 9184번: 신나는 함수 실행 (0) | 2024.07.23 |
🥈 5623번: 수열의 합 (0) | 2024.07.19 |