PS

BOJ 1276 - 교각 놓기

728x90

www.acmicpc.net/problem/1276

 

1276번: 교각 놓기

첫째 줄에 다리의 개수를 나타내는 정수 N(1≤N≤100)이 주어진다. 둘째 줄부터 N+1번째 줄까지 각 줄에 다리의 위치를 나타내는 세 정수 Y, X1, X2가 주어지는 이는 (X1, Y)부터 (X2, Y)까지 다리가 놓여

www.acmicpc.net

 

문제에서 요구하는 것은, 교각의 길이를 최소화 하여 설치하는 방법을 찾는 것 이므로

수평 값(x1, x2) 에 대해서는 별도의 정렬 처리를 해줄 필요가 없고,

수직 값(y) 에 대해서 정렬 처리를 해줄수밖에 없다.

 

수직값을 내림 차순으로 정렬해서 높은 위치에 있는 다리 부터 탐색을 시도하는데,

자신보다 높이가 낮은 다리의 x 좌표 구간에 현재 다리의 x 좌표 구간이 겹치면,

자신보다 높이가 낮은 다리위에 교각을 세울 수 있다는 소리이므로, 그 지점에 세워서 높이를 낮춘다.

만약 x 좌표 구간이 겹치는 자신보다 높이가 낮은 다리가 없으면 땅 바닥에 세워야 한다. 

 

 

 

- c++

#include <algorithm>
#include <iostream>
#include <vector>
 
using namespace std;
 
typedef struct {
    int y;
    int x1;
    int x2;
}Pos;
 
vector<Pos> vec;
 
int n, answer;
 
bool comp(Pos& p1, Pos& p2) {
    return p1.y > p2.y;
}
 
int main() {
    cin.tie(0); ios_base::sync_with_stdio(0);
    
    cin >> n;
    for (int i = 0; i < n; ++i) {
        Pos temp;
        int y, x1, x2;
        cin >> y >> x1 >> x2;
        temp.y = y;
        temp.x1 = x1;
        temp.x2 = x2;
        vec.push_back(temp);
    }
    
    sort(vec.begin(), vec.end(), comp);
    
    for (int i = 0; i < n; ++i) {
        answer += 2 * vec[i].y;
        int x1 = vec[i].x1, x2 = vec[i].x2 - 1;
        for (int j = i + 1; j < n; ++j) {
            if (x1 >= vec[j].x1 && x1 < vec[j].x2) {
                answer -= vec[j].y;
                break;
            }
        }
        for (int j = i + 1; j < n; ++j) {
            if (x2 >= vec[j].x1 && x2 < vec[j].x2) {
                answer -= vec[j].y;
                break;
            }
        }
    }
    
    cout << answer;
    
    return 0;
}
cs

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 15997 - 승부예측  (0) 2021.01.17
BOJ 2254 - 감옥 건설  (0) 2021.01.16
BOJ 1461 - 도서관  (0) 2021.01.14
BOJ 10775 - 공항  (0) 2021.01.13
BOJ 6236 - 용돈 관리  (0) 2021.01.12