-
[17503] 맥주 축제BOJ 2021. 11. 10. 10:29
https://www.acmicpc.net/problem/17503
17503번: 맥주 축제
첫 번째 줄에 축제가 열리는 기간 N (1 ≤ N ≤ 200,000) 과, 채워야 하는 선호도의 합 M (1 ≤ M < 231) 과, 마실 수 있는 맥주 종류의 수 K (N ≤ K ≤ 200,000) 가 주어집니다. 다음 K개의 줄에는 1번부터 K
www.acmicpc.net
<문제>
이분탐색으로 탐색 횟수를 log2(2^31) == 31번정도로 만들 수 있고,
하나의 탐색당 O(KlogK)정도만에 먹을 수 있는 맥주의 선호도 합을 구할 수 있다.
<소스코드>
12345678910111213141516171819202122232425262728293031323334353637#include <bits/stdc++.h>using namespace std;typedef long long ll;ll n, m, k;vector<pair<ll, ll>> v;bool getScore(ll mx) {ll ret = 0, cnt = 0;vector<ll> sc;for (int i = 0; i < k; i++)if (v[i].second <= mx) sc.push_back(v[i].first);if (sc.size() < n) return false;sort(sc.begin(), sc.end(), greater<ll>());for (int i = 0; i < n; i++) ret += sc[i];return ret >= m;}int main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> m >> k;v.resize(k);int i;ll l = 1, r = 1e10, ans = 1e10;for (i = 0; i < k; i++) cin >> v[i].first >> v[i].second;while (l <= r) {ll mid = (l + r) / 2;bool flag = getScore(mid);if (flag) {r = mid - 1;ans = min(mid, ans);} elsel = mid + 1;}if (ans == 1e10) ans = -1;cout << ans;return 0;}cs 'BOJ' 카테고리의 다른 글
[1011] Fly me to the Alpha Centauri (0) 2021.11.12 [1182] 부분수열의 합 (0) 2021.11.10 [13975] 파일 합치기 3 (0) 2021.11.09 [14395] 4연산 (0) 2021.11.09 [16973] 직사각형 탈출 (0) 2021.11.09