문제 링크
문제
동하와 지원이는 ANA 행사를 준비하고 있다. 행사를 위해 종류의 물건이 한 개씩 필요하기 때문에 동하가 개를, 지원이가 개를 나눠서 준비하기로 했다.
근처에 있는 상점 1, 2에서 종류의 물건을 모두 판매하고 있다. 같은 물건이라도 상점에서 판매하는 가격이 다를 수 있기 때문에 동하는 상점 1에서, 지원이는 상점 2에서 물건을 구입하려고 한다. 상점 1에서는 각각의 물건을 p1, p2, ⋯, pN원에 판매하고, 상점 2에서는 q1, q2, ⋯, qN원에 판매한다.
동하가 상점 1에서 A개의 물건을, 지원이가 상점 2에서 B개의 물건을 구입해서 종류의 물건을 모두 구매하는 데 필요한 최소 비용을 구해보자.
입력
첫째 줄에 정수 N(2 ≤ N ≤ 100,000)과 정수 A, B(1 ≤ A, B ≤ N; A + B = N)가 공백으로 구분되어 주어진다.
둘째 줄부터 개의 줄에 정수 pi, qi(1 ≤ pi, qi ≤ 10^9)가 공백으로 구분되어 주어진다. pi, qi는 상점 1, 2에서 번째 물건을 판매하는 가격을 의미한다.
출력
상점 1에서 개의 물건을, 상점 2에서 개의 물건을 구입해서 종류의 물건을 모두 구매하는 데 필요한 최소 비용을 출력한다.
예제 입력 1
5 2 3
4 6
7 2
5 5
3 6
10 9
예제 출력 1
23
예제 입력 2
2 1 1
2 1
3 4
예제 출력 2
4
알고리즘 분류
- 그리디 알고리즘
풀이
다른 상점에서 구매할 때보다 지금 상점에서 구매할 때 최대한 가격이 낮아야 한다. 따라서 상점 1에서의 가격과 상점 2에서의 가격 차가 낮은 순으로 N개의 물건을 정렬한다.
그리고 첫 번째 물건부터 A개의 물건을 동하가 구매하고, 나머지 물건은 지원이가 구매한다.
코드
더보기
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#define LL long long
#define FASTIO cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
using namespace std;
int N, A, B;
vector<pair<LL, LL> > Vec;
LL Answer;
void input() {
cin >> N >> A >> B;
Vec.resize(N);
for (int i = 0; i < N; i++) {
cin >> Vec[i].first >> Vec[i].second;
}
}
bool Comp(pair<LL, LL> PA, pair<LL, LL> PB) {
return ((PA.first - PA.second) < (PB.first - PB.second));
}
void settings() {
sort(Vec.begin(), Vec.end(), Comp);
for (int i = 0; i < A; i++) {
Answer += Vec[i].first;
}
for (int i = A; i < N; i++) {
Answer += Vec[i].second;
}
}
void find_Answer() {
cout << Answer << "\n";
}
int main() {
FASTIO
input();
settings();
find_Answer();
return 0;
}
'BOJ > Silver' 카테고리의 다른 글
[BOJ/Silver 2] 백준 16112 5차 전직(C++) (0) | 2024.02.17 |
---|---|
[BOJ/Silver 2] 백준 20413 MVP 다이아몬드 (Easy)(C++) (1) | 2024.02.17 |
[BOJ/Silver 3] 백준 30701 돌아온 똥게임(C++) (0) | 2024.02.14 |
[BOJ/Silver 5] 백준 25496 장신구 명장 임스(C++) (5) | 2024.02.13 |
[BOJ/Silver 5] 백준 25644 최대 상승(C++) (0) | 2024.02.13 |