내용으로 건너뛰기
테페리넷
사용자 도구
등록
로그인
사이트 도구
검색
도구
문서 보기
Fold/unfold all
역링크
미디어 관리자
사이트맵
등록
로그인
>
미디어 관리자
사이트맵
현재 위치:
테페리넷
»
Problem Solving
»
문제
»
백준 온라인 저지 (BOJ)
»
대회 개최
ps:problems:boj:31411
이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
====== 대회 개최 ====== ===== 풀이 ===== * 주어진 난이도 커브 공식 $ |x_0-x_1| + |x_1-x_2| + ... + |x_{N-1} - x_{N}| $ 을 바꿔쓰면 max(x) - min(x) 이 된다. 그러므로 문제들의 난이도들이 결정되면, 난이도커브값은 가장 어려운 난이도와 가장 쉬운 난이도의 차이가 된다. * 가장 어려운 난이도와 가장 쉬운 난이도의 차이가 최소화 되는 난이도들을 구하면 된다. 모든 문제의 난이도들을 정렬해서 하나의 배열에 저장해두자. 이렇게 하면 모든 문제 종류를 포함하면서 최댓값과 최솟값의 차이가 가장 작은 부분구간을 찾는 문제로 바꿀수 있다. 이것은 투포인터를 이용해서 푸는 전형적인 형태의 문제가 된다. 시간복잡도는 정렬에 O(NKlog(NK)), 투포인터 서치에 O(NK), 총 O(NKlog(NK))가 된다. ===== 코드 ===== <dkpr py> """Solution code for "BOJ 31411. 대회 개최". - Problem link: https://www.acmicpc.net/problem/31411 - Solution link: http://www.teferi.net/ps/problems/boj/31411 Tags: [two pointer] """ import sys from teflib import twopointer def main(): # pylint: disable=unused-variable N, K = [int(x) for x in sys.stdin.readline().split()] problems = [] for i in range(N): d_i = [int(x) for x in sys.stdin.readline().split()] problems.extend((d_ij, i) for d_ij in d_i) difficulties, algos = zip(*sorted(problems)) answer = min( difficulties[end - 1] - difficulties[beg] for beg, end in twopointer.minimal_ranges_with_k_unique_elems(algos, N) ) print(answer) if __name__ == '__main__': main() </dkpr> * Dependency: [[:ps:teflib:twopointer#minimal_ranges_with_k_unique_elems|teflib.twopointer.minimal_ranges_with_k_unique_elems]] {{tag>BOJ ps:problems:boj:골드_1}}
ps/problems/boj/31411.txt
· 마지막으로 수정됨: 2024/03/05 15:02 저자
teferi
문서 도구
문서 보기
역링크
Fold/unfold all
맨 위로