레이블이 자료구조인 게시물을 표시합니다. 모든 게시물 표시
레이블이 자료구조인 게시물을 표시합니다. 모든 게시물 표시

2016년 8월 23일 화요일

1715 - 카드 정렬하기

https://www.acmicpc.net/problem/1715

항상 카드의 장수가 가장 작은 두 묶음을 합치는 것이 결과적으로 최소의 비교 횟수이다.
대체 왜..?
라고 생각할수있다. "왠지 그러는 게 맞는 것 같다"는 말도 안되는 논리(혹은 풀이 도출)로 풀어온 문제가 정말 많았다.
그래서 오늘은 증명을 연습해보려 한다.

카드를 합치는 과정을 설명하기 위해 다음과 같이 정의해보겠다.
$a =$ 가장 작은 수 (i.e. $a$장의 카드 묶음)
$b =$ 두번째로 작은 수
$c = a, b$ 가 아닌 다른 어떤 수

위 정의에 의하면 $a \le b \le c$ 이다. 아래 3가지 경우가 있다.

  • $a$와 $c$를 합친 후, 그것을 $b$와 합친다 : $(a+c)+ \{(a+c)+b\}$
  • $a$와 $b$를 합친 후, 그것을 $c$와 합친다 : $(a+b)+ \{(a+b)+c\}$
  • $b$와 $c$를 합친 후, 그것을 $a$와 합친다 : $(b+c)+ \{(b+c)+a\}$

세 항 모두 중괄호로 둘러싼 부분이 $a+b+c$로 공통이므로 비교하기 위해 생략할 수 있다.

$a+b \le a+c$ 이고, $a+b \le b+c$ 이므로
$(a+b)+ \{(a+b)+c\}$ 가 가장 최소이다.

따라서 가장 작은 두 수를 합치는 것이 항상 최소이다.

증명을 별로 해본적이 없어서 맞는 지 확신이 안 선다.
댓글로 지적해주시면 감사하겠습니다.

2016년 5월 8일 일요일

3770 - 대한민국

https://www.acmicpc.net/problem/3770
http://www.spoj.com/problems/MSE06H/


세그먼트 트리로 풀었다.

위 그림을 참고해서 풀었음. 다듬어서 다시 업로드 예정

2016년 4월 13일 수요일

3077 - 임진왜란

https://www.acmicpc.net/problem/3077

주어진 사건들의 이름에 대응되는 인덱스들만 저장해서 나중에 $O(N^{2})$ 만큼 돌면서 크기가 $i$번째 이후 중에서 $i$번째보다 큰 인덱스만 세려고 했다.

자료구조 map을 써서 각 사건들의 인덱스를 저장한 후, 사건이 입력될 때마다 j=i+1~N 의 반복문에서 index[ 사건[i] ] < index[ 사건[j] ] 를 썼더니 map에서 조회 연산이 $O(NlogN)$ 이라 그런지 시간초과를 먹었다. (당시에는 map에서 조회하는 연산을 생각하지 못해서 30분 정도 삽질한듯.. 생각나는 대로 코딩하는 자의 최후)

2016년 4월 6일 수요일

9322 - 철벽 보안 알고리즘

https://www.acmicpc.net/problem/9322

제 1 공개키와 제 2 공개키를 비교하여 위치가 어떻게 바뀌는 지 저장하고 암호문은 그 반대로 위치를 참조하여 출력하도록 했다.

게시글 목록