반응형
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=942&sca=99&sfl=wr_hit&stx=1669
#include <stdio.h>
struct sausage {
int len, wid, visited;
} ssg[5010], tmp[5010];
int N, ans;
void mergesort(int s, int e) {
if (s >= e) return;
int m = (s + e) / 2, k = s, a = s, b = m + 1;
mergesort(s, m);
mergesort(m + 1, e);
while (a <= m && b <= e) {
if (ssg[a].len < ssg[b].len) tmp[k++] = ssg[a++];
else if (ssg[a].len > ssg[b].len) tmp[k++] = ssg[b++];
else
if (ssg[a].wid < ssg[b].wid) tmp[k++] = ssg[a++];
else tmp[k++] = ssg[b++];
}
while (a <= m) tmp[k++] = ssg[a++];
while (b <= e) tmp[k++] = ssg[b++];
for (int i = s; i <= e; i++) ssg[i] = tmp[i];
}
int calc() {
int cnt = 0;
while (cnt < N) { //모든 소세지가 찍힐 때까지 반복
ans++;
int i;
sausage curssg;
for (i = 0; i < N; i++) if (ssg[i].visited == 0) {
ssg[i].visited = 1;
cnt++;
curssg = ssg[i++];
break;
}//아직 안 찍힌 소세지 중 가장 작은 것 선택
for (; i < N; i++) {
sausage& next = ssg[i];
if (next.visited) continue;
if (curssg.len > next.len || curssg.wid > next.wid) continue; //건너뛰기
else {
next.visited = 1;
cnt++;
curssg = ssg[i];
}
}//위로 가면서 같이 만들 수 있는 소세지 같이 찍음
}
return ans;
}
int main(void) {
//freopen("input.txt", "r", stdin);
scanf("%d", &N);
for (int i = 0; i < N; i++) scanf("%d %d", &ssg[i].len, &ssg[i].wid);
mergesort(0, N - 1);
ans = calc();
printf("%d\n", ans);
return 0;
}
반응형
'프로그래밍 알고리즘' 카테고리의 다른 글
[정올 1716] 이진트리 탐색 (0) | 2023.01.05 |
---|---|
[정올 1697] 큐(queue) (1) | 2023.01.05 |
[정올 1658] 최대공약수와최소공배수 (0) | 2023.01.05 |
[정올 1566] 소수문자열 (1) | 2023.01.05 |
[정올 1535] 단어집합2 (0) | 2023.01.05 |