사용자 도구

사이트 도구


ps:problems:boj:18353

병사 배치하기

ps
링크acmicpc.net/…
출처BOJ
문제 번호18353
문제명병사 배치하기
레벨실버 2
분류

LIS

시간복잡도O(nlogn)
인풋사이즈n<=2000
사용한 언어Python
제출기록32928KB / 72ms
최고기록56ms
해결날짜2022/02/27

풀이

  • 발상에 걸린 시간: 매우짧음 / 구현에 걸린 시간: 매우짧음
  • 그냥 문제를 읽으면 최장 감소 부분 수열의 길이를 구하라는 문제라는 것을 바로 알수 있다.
  • 전체 길이에서 최장 감소 부분 수열의 길이를 뺀 값이 열외해야하는 최소 병사수가 된다.
  • 최장 감소 부분 수열은, 수열을 뒤집어서 가장 긴 증가하는 부분 수열 (Longest Increasing Subsequence / LIS)을 구하면 간단하다. 시간복잡도는 O(nlogn).

코드

"""Solution code for "BOJ 18353. 병사 배치하기".

- Problem link: https://www.acmicpc.net/problem/18353
- Solution link: http://www.teferi.net/ps/problems/boj/18353

Tags: [LIS]
"""

import bisect


def main():
    N = int(input())  # pylint: disable=unused-variable
    nums = [int(x) for x in input().split()]

    arr = []
    for num in reversed(nums):
        pos = bisect.bisect_left(arr, num)
        if pos == len(arr):
            arr.append(num)
        else:
            arr[pos] = num

    print(N - len(arr))


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
M Y G X​ G
 
ps/problems/boj/18353.txt · 마지막으로 수정됨: 2022/02/28 12:38 저자 teferi