※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 25045번 문제인 비즈마켓이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/25045
25045번: 비즈마켓
비즈마켓은 "고객 기업 운영의 효율화에 기여하며, 그 구성원의 복지 만세를 추구한다." 라는 기조 아래 기업을 주 대상으로 복지몰 사업, 기업 판촉 및 사은품 사업, 산업재 유통 사업을 하는 온
www.acmicpc.net
고객만족도가 0 미만인 거래를 하지 않는다는 조건이 없을 때, 거래를 정확히 K개 할 때의 고객만족도의 합의 최댓값은 (고객만족도가 높은 K개의 물품의 만족도 합) - (지불비용이 낮은 K개의 비용의 합)으로 계산할 수 있다.
모든 거래방법의 경우의 수는 거래 개수가 0개, 1개, ..., min(N,M)개 중 하나에 들어가므로, K를 0부터 min(N,M)까지 시도해 그중 최댓값을 구하는 것으로 문제의 답을 구해내자. 이중 (고객만족도 - 지불비용)의 값이 음수값이 나올 수밖에 없는 경우가 발생하면 그때의 고객만족도의 합은 위 과정에서 등장하는 최댓값 미만이 될 수밖에 없다는 점을 관찰하자. 해당 음수값이 나오는 쌍을 제외하면 더 큰 값의 고객만족도 합을 얻을 수 있기 때문이다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int N, M;
int A[200000];
int B[200000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
for (int i = 0; i < N; i++) cin >> A[i];
for (int i = 0; i < M; i++) cin >> B[i];
sort(A, A + N);
sort(B, B + M);
int Aidx = N - 1, Bidx = 0;
ll ans = 0, cur = 0;
while (Aidx > -1 && Bidx < M) {
cur += A[Aidx--] - B[Bidx++];
ans = max(ans, cur);
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 25049 // C++] 뮤직 플레이리스트 (0) | 2022.10.05 |
---|---|
[BOJ 25048 // C++] 랜선 연결 (1) | 2022.10.04 |
[BOJ 25044 // C++] 에어컨 (0) | 2022.10.02 |
[BOJ 14911 // C++] 궁합 쌍 찾기 (1) | 2022.10.01 |
[BOJ 6040 // C++] Hexadecimal Conversion (0) | 2022.09.30 |