문제 링크입니다: https://www.acmicpc.net/problem/3020
lower_bound와 upper_bound를 적절히 이용하면 쉽게 풀 수 있는 문제였습니다.
코드를 보면 금방 이해할 수 있을 것입니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int INF = 987654321;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N, H;
cin >> N >> H;
vector<int> bottom(N/2), top(N/2);
for (int i = 0; i < N/2; i++)
cin >> bottom[i] >> top[i];
sort(bottom.begin(), bottom.end());
sort(top.begin(), top.end());
int result = INF;
int cnt = 1;
for (int i = 1; i <= H; i++)
{
//해당 높이에 겹치는 석순
int temp = bottom.size() - (lower_bound(bottom.begin(), bottom.end(), i) - bottom.begin());
//해당 높이에 겹치는 종유석
temp += top.size() - (upper_bound(top.begin(), top.end(), H - i) - top.begin());
if (result == temp)
cnt++;
else if (result > temp)
{
result = temp;
cnt = 1;
}
}
cout << result << " " << cnt << "\n";
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2143번 두 배열의 합 (0) | 2019.01.27 |
---|---|
백준 2632번 피자 판매 (6) | 2019.01.27 |
백준 7453번 합이 0인 네 정수 (3) | 2019.01.27 |
백준 1208번 부분집합의 합 2 (6) | 2019.01.27 |
백준 1644번 소수의 연속합 (0) | 2019.01.27 |