본문 바로가기

백준

1026)보물

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


이 문제를 요약해보면 S+=A[i]*B[i]를 구하는 것인데 S가 최소가 되게 해야 한다.


문제를 읽어 보면 함정이 있는데 A는 재배열해도 되고 B는 재배열하지 말라고 한다.


이 문구를 고려하지 않고 수열 A와 수열 B를 최소가 되게 각 항들을 매칭시키는 방법은


A를 오름 차순으로 정렬하고 B를 내림 차순으로 정렬해 A[i]와 B[i]를 매칭시키는 것이다.


왜냐하면 수열 A의 i번째로 큰 값과 수열 B의 i번째로 작은 값을 매칭하기 때문이다.


그래서 두 항 A[i]와 B[i]의 곱은 항상 i번째로 작을 수 밖에 없다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<stdio.h>
 
void swap(int *A, int *B) {
    int temp;
 
    temp = *A;
    *= *B;
    *= temp;
}
 
int partition(int *A, int p, int r) {
    int pivot = (p + r) / 2;
    int i = p - 1;
 
    swap(&A[pivot], &A[r]);
    for (int j = p; j < r; j++) {
        if (A[j] < A[r]) {
            swap(&A[++i], &A[j]);
        }
 
    }
    swap(&A[i + 1], &A[r]);
 
    return i + 1;
}
 
void quickSort(int *A, int p, int r) {
    int q;
 
    if (p < r) {
        q = partition(A, p, r);
        quickSort(A, p, q - 1);
        quickSort(A, q + 1, r);
    }
}
 
int main() {
    int *A;
    int *B;
    int N;
    int sum = 0;
 
    scanf("%d"&N);
    A = (int *)malloc(sizeof(int)*N);
    B = (int *)malloc(sizeof(int)*N);
 
    for (int i = 0; i < N; i++) {
        scanf("%d"&A[i]);
    }
    for (int i = 0; i < N; i++) {
        scanf("%d"&B[i]);
    }
 
    quickSort(A, 0, N - 1);
    quickSort(B, 0, N - 1);
 
    for (int i = 0; i < N;i++) {
        sum += A[i] * B[(N - 1- i];
    }
 
    printf("%d\n",sum);
 
    return 0;
}
cs


'백준' 카테고리의 다른 글

2804)크로스워드 만들기  (0) 2019.02.03
5032)탄산 음료  (0) 2019.02.03
2108)통계학  (0) 2019.02.02
2563)색종이  (0) 2019.02.02
1789)수들의 합  (0) 2019.02.02