※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2515번 문제인 전시장이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2515
2515번: 전시장
첫째 줄에는 그림의 개수 N (1 ≤ N ≤ 300,000)과 판매가능 그림을 정의하는 1이상의 정수 S가 빈칸을 사이에 두고 주어진다. 다음 이어지는 N개의 줄 각각에는 한 그림의 높이와 가격을 나타내는 정
www.acmicpc.net
이 문제에서는 높이순서로 정렬된 그림들에서 팔릴 수 있는 그림 간격을 두고 가장 비싸게 팔릴 그림을 선택하는 문제이다.
dp[i]를 i번 그림까지를 고려할 때의 "가장 큰 판매가능그림의 가격의 합"로 정의하면, 간단한 dp로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct image {
int h, p;
image(int h, int p) {
this->h = h, this->p = p;
}
};
bool comp(image im1, image im2) {
if (im1.h != im2.h) return im1.h < im2.h;
else return im1.p < im2.p;
}
vector<image> img;
int dp[300001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, K; cin >> N >> K;
img.emplace_back(image(0,0));
for (int i = 0; i < N; i++) {
int h, p; cin >> h >> p;
img.emplace_back(image(h, p));
}
sort(img.begin(), img.end(), comp);
int idx = 0;
for (int i = 1; i <= N; i++) {
while (idx + 1 < i && img[i].h - img[idx + 1].h >= K) idx++;
int temp = max(dp[i - 1], dp[idx] + img[i].p);
dp[i] = temp;
}
cout << dp[N];
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 6497 // C++] 전력난 (0) | 2021.10.17 |
---|---|
[BOJ 18116 // C++] 로봇 조립 (0) | 2021.10.16 |
[BOJ 1202 // C++] 보석 도둑 (0) | 2021.10.14 |
[BOJ 2583 // C++] 영역 구하기 (0) | 2021.10.13 |
[BOJ 8112 // C++] 0과 1 - 2 (0) | 2021.10.12 |