[๋ฌธ์ ]
https://www.acmicpc.net/problem/2343
N ๊ฐ์ ๊ฐ์๊ฐ ์ฃผ์ด์ง ๋ ๊ฐ์๋ค์ ๋ช๊ฐ์ฉ ์ฎ์ด์ ๋ธ๋ฃจ๋ ์ด๋ก ๋ง๋ค์ด์ ํ๋งคํ๋ ค๊ณ ํ๋ค.
๊ฐ์๋ค์ ์ฎ์ ๋ ๊ฐ์์ ์์๊ฐ ๋ฐ๋๋ฉด์๋๊ณ , ๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ๋ ๋ชจ๋ ๊ฐ์์ผ ํ๋ค.
์ฆ, ๊ฐ์๋ฅผ ์ชผ๊ฐค ์ ์๋ ์ต์ํฉ์ ์ฐพ์.
*๋ฌธ์ ์กฐ๊ฑด
๊ฐ์์ ์ N (1 ≤ N ≤ 100,000)๊ณผ M (1 ≤ M ≤ N)
๊ฐ ๊ฐ์์ ๊ธธ์ด๋ 10,000๋ถ์ ๋์ง ์๋๋ค.
[์์]
9 3
1 2 3 4 5 6 7 8 9
17
๊ฐ์๋ ์ด 9๊ฐ์ด๊ณ , ๋ธ๋ฃจ๋ ์ด๋ ์ด 3๊ฐ ๊ฐ์ง๊ณ ์๋ค.
1๋ฒ ๋ธ๋ฃจ๋ ์ด์ 1, 2, 3, 4, 5
2๋ฒ ๋ธ๋ฃจ๋ ์ด์ 6, 7
3๋ฒ ๋ธ๋ฃจ๋ ์ด์ 8, 9
์ ๋ฃ์ผ๋ฉด ๊ฐ ๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ๋ 15, 13, 17์ด ๋๋ค.
๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ๋ ๋ชจ๋ ๊ฐ์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ๋ 17์ด ๋๋ค.
17๋ณด๋ค ๋ ์์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ ๋ธ๋ฃจ๋ ์ด๋ฅผ ๋ง๋ค ์ ์๋ค.
[ํ์ด]
๊ฐ์์ ์๊ฐ N (1 ≤ N ≤ 100,000)์ด๊ณ ๋ธ๋ฃจ๋ ์ด์ ์ M (1 ≤ M ≤ N) ๊ฐ์ ๊ฐ์ง๋ฏ๋ก
๋จ์ํ๊ฒ ํ๋ฉด NC1 + NC2 + NC3 + ... + NCN = 2^N -1๋ก ๋งค์ฐ ํฐ ์๊ฐ ๋์ด ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ ํ์ ์๋ฅผ ์ค์ผ ์ ์๋ ์ด๋ถํ์์ ์ด์ฉํด์ผ ํ๋ค.
์ด๋ถํ์์ ์ ๋ ฌ ํ, ํ์์ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์ ํด๋์ด์ผ ํ๋ค.
๋ธ๋ฃจ๋ ์ด ์ต์๊ฐ : ๊ฐ์ฅ ๊ธด ๊ฐ์์ ๊ธธ์ด
๋ธ๋ฃจ๋ ์ด ์ต๋๊ฐ : ๋ชจ๋ ๊ฐ์ ๊ธธ์ด์ ํฉ
๋ธ๋ฃจ๋ ์ด๊ฐ ๊ฐ์ง ์ ์๋ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ์ค๊ฐ๊ฐ์ ์ ๋ต์ผ๋ก ๋ฏธ๋ฆฌ ์ง์ ํด๋๊ณ ๊ฐ์๊ฐ ๋๋ ์ง๋์ง ํ๋จํ๋ค.
์ฆ,
์ค๊ฐ๊ฐ = (์ต์๊ฐ + ์ต๋๊ฐ) / 2
1) 1๋ฒ ๊ฐ์๋ถํฐ ๊ฐ์๋ค์ ํฉ์ ์ค๊ฐ ๊ฐ๋ณด๋ค ์ปค์ง ๋๊น์ง ๊ฐ์์ ์๋ฅผ ๋ํ๋ค.
2) ์ค๊ฐ๊ฐ์ ๋์ด๊ฐ๋ฉด 1์ ์นด์ดํธํ๊ณ ๊ฐ์ ํฉ์ 0์ผ๋ก ๋ฆฌ์ ํ๊ณ ๊ฐ์๋ฅผ ๋ค์ ๋ํ๋ค.
3) ๋ง์ง๋ง ๊ฐ์๊น์ง ํฉ์ ๊ตฌํ์ผ๋ฉด ์นด์ดํธ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ต์๊ฐ, ์ต๋๊ฐ์ ๊ฐฑ์ ํ๋ค.
3-1) ์นด์ดํธ ๊ฐ < ๋ธ๋ฃจ๋ ์ด ๊ฐ์ ์ด๋ฉด, ๋ ์์ ํฌ๊ธฐ ๊ฐ์ผ๋ก ์ชผ๊ฐ์ผ ํ๋ฏ๋ก ์ต๋๊ฐ = ์ค๊ฐ๊ฐ -1 ๋ก ๋๊ณ ๋ค์ ํ์ํ๋ค.
3-2) ์นด์ดํธ ๊ฐ > ๋ธ๋ฃจ๋ ์ด ๊ฐ์ ์ด๋ฉด, ๋ ํฐ ํฌ๊ธฐ ๊ฐ์ผ๋ก ์ชผ๊ฐ์ผ ํ๋ฏ๋ก ์ต์๊ฐ = ์ค๊ฐ๊ฐ + 1 ๋ก ๋๊ณ ๋ค์ ํ์ํ๋ค.
[์ฝ๋]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int lectureNum, bluerayNum, input;
int l, r = 0, mid = 0; // left, right, mid
vector<int> lectures;
// 1. Input
cin >> lectureNum >> bluerayNum;
for (int i = 0; i < lectureNum; i++) {
cin >> input;
lectures.push_back(input);
r += input;
}
// 2. SearchByBinary
l = *max_element(lectures.begin(), lectures.end());
while (l <= r) {
mid = (l + r) / 2;
int sum = 0, count = 0;
for (int i = 0; i < lectureNum; i++) {
if (sum + lectures[i] > mid) {
count++;
sum = 0;
}
sum += lectures[i];
}
if (sum != 0) count++;
if (count > bluerayNum) l = mid + 1;
else r = mid - 1;
}
// 3. Output
cout << l << "\n";
return 0;
}
[๋ฐ๋ก]
7 7
5 9 6 8 7 7 5
answer: 9
4 3
99 1 99 1
answer: 100
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] 1463๋ฒ 1๋ก ๋ง๋ค๊ธฐ(feat. DP) (0) | 2024.06.07 |
---|---|
[BOJ][C++] 1269 ๋์นญ ์ฐจ์งํฉ(feat. ์ด๋ถํ์) (0) | 2024.05.25 |
[C++][BOJ] 2792๋ฒ ๋ณด์ ์์(feat. ์ด๋ถ ํ์) (0) | 2024.05.21 |
[C++][BOJ] 9935 ๋ฌธ์์ด ํญ๋ฐ :: ๋ฌธ์์ด ๋น๊ต(stack, erase) (0) | 2024.05.15 |
[C++][BOJ] 1931 ํ์์ค ๋ฐฐ์ :: ๋ผ์ธ ์ค์ํ (0) | 2024.05.15 |