문제 링크입니다: https://www.acmicpc.net/problem/15732
이분탐색으로 접근하는데 시간이 오래걸렸던 문제였습니다.
핵심은 해당 박스번호(mid) 이하에 몇 개의 도토리가 있는지를 파악하는 것이였습니다.
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 10000;
int N, K, D;
pair<int, pair<int, int>> rule[MAX];
//해당 박스 번호가 마지막이라고 가정했을 때 몇개의 도토리가 들어있는가
bool func(int mid)
{
long long sum = 0;
for (int i = 0; i < K; i++)
{
int high = min(rule[i].second.first, mid);
if (high >= rule[i].first)
sum += ((high - rule[i].first) / rule[i].second.second) + 1;
}
return sum >= D;
}
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N >> K >> D;
for (int i = 0; i < K; i++)
cin >> rule[i].first >> rule[i].second.first >> rule[i].second.second;
int low = 0, high = N;
int result = 0;
while (low <= high)
{
//박스 번호
int mid = (low + high) / 2;
if (func(mid))
{
result = mid;
high = mid - 1;
}
else
low = mid + 1;
}
cout << result << "\n";
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
'알고리즘 > BOJ' 카테고리의 다른 글
백준 3012번 올바른 괄호 문자열 (0) | 2019.02.05 |
---|---|
백준 16434번 드래곤 앤 던전 (6) | 2019.02.05 |
백준 5425번 자리합 (0) | 2019.02.04 |
백준 6236번 용돈 관리 (0) | 2019.02.04 |
백준 2343번 기타 레슨 (0) | 2019.02.04 |