본문 바로가기

백준

백준2565 - 전깃줄

https://www.acmicpc.net/problem/2565

 

2565번: 전깃줄

첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는 위치의 번호가 차례로 주어진다. 위치의 번호는 500 이하의 자연수이고, 같은 위치에 두 개 이상의 전깃줄이 연결될 수 없다.

www.acmicpc.net

LIS문제다. 벡터의 인자로 pair를 받은 뒤 A 가로등을 기준으로 오름차순 정렬을 한다. 정렬이 된 상태에서 B에 LIS를 실행하여 최대 증가 수열을 찾으면 된다.

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
	int n;
	int a, b;
	vector<pair<int, int>> v; //first는 A 전봇대, second는 B 전봇대
	vector<int> ans; //최대 증가 수열
	
	ans.push_back(0); //처음 기준으로 양수 밖에 없는 B 전봇대를 삽입하기 위해 0을 넣음

	//A 전봇대와 B 전봇대의 위치를 삽입
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> a >> b;
		v.push_back(pair<int, int>(a, b));
	}

	//오름차순 정렬
	sort(v.begin(), v.end());

	//LIS를 실행
	for (int i = 0; i < v.size(); i++) {
		if (ans.back() < v[i].second) {
			ans.emplace_back(v[i].second);
		}
		else {
			auto it = lower_bound(ans.begin(), ans.end(), v[i].second);
			*it = v[i].second;
		}
	}

	//ans에서 0은 원소로 생각하면 안되니까 -1을 한다.
	cout << v.size() - (ans.size() - 1);
}

'백준' 카테고리의 다른 글

백준1912 - 연속합  (0) 2020.01.31
백준10844 - 쉬운 계단 수  (0) 2020.01.30
백준11568 - 민균이의 계락  (0) 2020.01.26
백준2210 - 숫자판 점프  (0) 2020.01.19
백준2096 - 내려가기  (0) 2020.01.18