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 |