티스토리 뷰
문제
알고리즘
binary search
풀이
COWVID-19의 영향으로 사회적 거리두기를 실천하는 소들의 수가 주어집니다. 목초지의 범위가 주어지고 해당 범위안에 소를 배치하되, 가장 가까운 소의 거리가 최대가 되도록 하는 문제입니다.
소들을 임의의 거리 d로 배치할 수 있다면, d이하의 거리로 소를 배치할 수 있음이 자명합니다. 이분탐색으로 범위를 좁혀나갈 수 있다는 뜻과 동치입니다.
solve함수는 거리d로 N마리의 소를 배치할 수 있는가를 리턴하는 함수입니다. cur은 가장 최근에 소를 배치한 지역을 의미합니다. 맨 처음에는 당연히 소를 배치하지 않았으므로 가장 작은 수로 초기화를 합니다. 다음의 cur이 될 수 있는 후보들은 cur+d 또는 범위의 시작인 f 입니다.
solve함수는 cnt값이 N이상이 되면 종료하므로 하나의 solve함수는 O(N+M)안에 검사가 가능합니다.
전체 시간복잡도는 O((N+M)∗R) 입니다. (단, R은 전체 범위를 나타냄 )
코드
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0;i<n;++i)
#define REP(i,n) for(int i=1;i<=n;++i)
#define FAST cin.tie(NULL);cout.tie(NULL); ios::sync_with_stdio(false)
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
int N, M;
vector<pll> vt;
bool solve(ll d) {
int cur = INT_MIN;
int cnt = 0;
rep(i, M) {
auto [f, s] = vt[i];
while (cur <= s - d) {
cur = max(cur + d, f);
cnt += 1;
}
}
return cnt >= N;
}
int main() {
FAST;
cin >> N >> M;
vt.resize(M);
rep(i, M) {
auto& [f, s] = vt[i];
cin >> f >> s;
}
sort(vt.begin(), vt.end());
ll lo = 1;
ll hi = 1e18;
ll best = 0;
while (lo <= hi) {
ll mid = (lo + hi) / 2;
if (solve(mid)) {
best = mid;
lo = mid + 1;
}
else hi = mid - 1;
}
cout << best;
return 0;
}
'Algorithm' 카테고리의 다른 글
[백준 18878] Cereal (0) | 2020.10.26 |
---|---|
[백준 3392] 화성지도 (0) | 2020.10.25 |
[백준 1517] 버블 소트 (0) | 2020.10.10 |
[백준 3584] 가장 가까운 공통 조상 (0) | 2020.10.08 |
[백준 12014] 주식 (0) | 2020.10.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 세그먼트트리
- spring boot
- 동적계획법
- 펜윅트리
- Segment tree
- Suffix Array
- Fenwick
- dfs
- knapsack
- sweeping
- 트라이
- kmp
- Oracle
- string
- implementation
- 좌표압축
- bfs
- spring
- 스위핑
- DP
- hld
- sorting
- dijkstra
- 정렬
- 이분매칭
- 이분탐색
- union find
- 2-SAT
- SCC
- greedy
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함