※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts