본문 바로가기

백준

백준18353 - 병사 배치하기

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

 

18353번: 병사 배치하기

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000) 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

LIS로 해결하면 되는 문제이다. 연속되게 작아지는 수열을 찾으면 되기 때문에 일반적인 LIS문제와 조금 다르지만 입력한 숫자에 마이너스를 붙여서 비교하면 내림차순도 찾을 수 있기 때문에 LIS로 해결하였다.

#include <iostream>
#include <vector>
#include <algorithm>
#define INF 987654321
using namespace std;

int main() {
    int n, x;
    vector<int> v;
    
    v.push_back(INF);
    cin >> n;
    for(int i = 0 ; i < n; i++) {
        cin >> x;
        x = -x; //내림차순인 수열을 찾기 위하여 -를 붙임
        if(v.back() < x) {
            v.push_back(x);
        }
        else {
            auto it = lower_bound(v.begin(), v.end(), x);
            *it = x;
        }
    }
    cout << n - v.size();
    return 0;
}

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

백준11501 - 주식  (0) 2020.05.16
백준16162 - 가희와 3단 고음  (0) 2020.05.13
백준1240 - 노드사이의 거리  (0) 2020.05.11
백준11607 - Grid  (0) 2020.05.01
백준9753 - 짝 곱  (0) 2020.04.21