백준 풀이 C++

백준 3020 c++ (이분탐색)

ag2개발자 2022. 9. 24. 16:51
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ss stable_sort
#define ll long long

int arr[100005];    
int arr2[100005];    //길이의 절반, 넉넉하게 5더해줌
int Min=200005;     //뚫는 장애물의 합 = 길이 +5(추가)
int cnt;    //뚫는 장애물의 개수

int main() {
    cin.tie(0)->sync_with_stdio(0);

    int n, h;
    cin >> n >> h;          //입력
    for (int i = 0; i < n / 2; i++) {    //반반 입력받아서 n/2
        cin >> arr[i]>> arr2[i];    
    }
    sort(arr, arr + n/2);
    sort(arr2, arr2 + n / 2);   //이분 탐색전 반드시 정렬

    for (int i = 1; i <= h; i++) {    //높이별 이분탐색 진행
        int a = lower_bound(arr, arr + (n / 2), i) - arr;
        //밑에 있는 장애물의 경우 높이가 i이상이면 뚫림
        //값이 i 이상인 최소 인덱스 반환
        a += upper_bound(arr2, arr2 + n / 2, h - i) - arr2;
        //위에 있는 장애물의 경우 높이가  h-i보다 커야함.
        // 값이 h-i보다 큰 최소 인덱스 반환.
        //이분탐색
        a = n - a;    //뚫는 개수는 전체 n에서 못뚫는 애들 뺴줌
        if (Min == a) {   //구하고 있는 최소값과 a가 같을 떄
            cnt++;        //개수++
        }
        else if (Min > a) {    //구하고 있는 최소값보다 a가 작을 때
            Min = a;    //최소를 구하므로 a가 Min이 됨.
            cnt = 1;    //개수는 1부터 다시 셈.
        }
    }
    cout << Min << " " << cnt;

    return 0;
}

'백준 풀이 C++' 카테고리의 다른 글

백준 2805 C++ (이분탐색)  (0) 2022.09.24
백준 2630 C++ (분할과 정복)  (0) 2022.09.24
백준 7785 c++ set 역순 출력  (1) 2022.09.23
백준 2702 C++(유클리드 호제법)  (0) 2022.09.22
백준 15651 N과M(3) (백트래킹)  (0) 2022.09.22