https://www.acmicpc.net/problem/1026
1026번: 보물
첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거
www.acmicpc.net
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <string>
#include <algorithm>
using namespace std;
int S(int A[], int B[], int N)
{
int sum = 0;
for (int i = 0; i < N; i++)
{
sum += (A[i] * B[i]);
}
return sum;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
int A[50];
int B[50];
for (int i = 0; i < N; i++)
cin >> A[i];
for (int i = 0; i < N; i++)
cin >> B[i];
sort(A, A + N, greater<>());
sort(B, B + N);
cout << S(A, B, N);
}
문제
A를 재배열해서 함수 S로 나올 수 있는 최솟값을 구하라
A를 어떻게 재배열해서 재배열하지않은 B를 이용해 최솟값을 구할 수 있을까?
B를 재배열하지말라고 했는데 위 문제는 딱히 재배열해도 답을 구하는데 문제가 생기지 않는다.
어찌됐든 B의 각 원소들은 A의 N개의 임의의 원소들과 곱해질 것이기때문에
A[i] * B[i] 의 최솟값은 뭐가 될 까?
생각해보면 최댓값은 가장 큰 원소와 가장 큰 원소끼리 곱하면서 더하면 될 것이다.
그러면 최솟값은 가장 큰 원소와 가장 작은 원소끼리 곱해서 더하면 되지 않을까?
나는 A를 내림차순으로 정렬하고 B를 오름차순으로 정렬한 뒤 S함수를 실행시켜서 최솟값을 구해보았다
결과는 정답, 문제에서 재배열 하지말라고 했지만 딱히 문제가 되지 않기 때문에 그냥 정렬을 이용해서 푼 문제
'알고리즘 문제' 카테고리의 다른 글
[C++] 백준 1021번 : 회전하는 큐 (0) | 2022.07.16 |
---|---|
[C++] 백준 4949번 : 균형잡힌 세상 (0) | 2022.07.15 |
[C++]백준 2164번 : 카드2 (0) | 2022.07.15 |
[C++] 백준 1158번 : 요세푸스 문제 (0) | 2022.07.15 |
[C++] 백준 1920번 : 수 찾기 (세모) (0) | 2022.07.14 |