반응형
greedy 문제였습니다.
풀이방법
상식적? 감으로 생각했을 때 S의 값을 가장 적게 만들기 위해서는 제일 작은 수를 제일 큰 수끼리 짝지어서 곱해주었을 때 그 합이 최소가 됩니다. 문제에서 B의 수는 재배열하면 안되지만 A는 옮길 수 있습니다. 이 말은 자칫 B를 고정하고 A를 한 칸씩 옮기는 brute force를 생각할 수 있으나 A,B 둘다 옮길 때와 A의 원소들만을 옆으로 옮겨줄 때는 같다는 생각을 한다면 B를 고정시킬 필요가 없다는 결론에 도달할 수 있습니다.
이 부분은 수학적으로 명확한 검증을 실패했습니다.. 혹시 아시는 분은 댓글로 설명 부탁드립니다...
Code
#include <bits/stdc++.h>
using namespace std;
int a[51],b[51],n,ans;
int main(){
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
for(int i = 0; i < n; i++) cin >> b[i];
sort(a,a+n);
sort(b,b+n);
for(int i = 0; i < n; i++){
ans += a[i] * b[n-i-1];
}
cout << ans << '\n';
}
'Algorithm > Greedy' 카테고리의 다른 글
(C++) - 백준(BOJ) 1449번 : 수리공 항승 답 (0) | 2021.02.20 |
---|---|
(C++) - 백준(BOJ) 4796번 : 캠핑 답 (0) | 2021.02.20 |
(C++) - 프로그래머스(고득점 kit - Greedy) : 체육복 (0) | 2021.02.15 |
(C++) - 백준(BOJ) 1931번 : 회의실배정 답 (0) | 2020.09.10 |
(C++) - 백준(BOJ)코딩 11047번 : 동전0 (0) | 2016.12.09 |