https://www.acmicpc.net/problem/2343
๋ฌธ์
๊ฐํ ๋ ์์ ์ ๊ธฐํ ๊ฐ์ ๋์์์ ๋ธ๋ฃจ๋ ์ด๋ก ๋ง๋ค์ด ํ๋งคํ๋ ค๊ณ ํ๋ค. ๋ธ๋ฃจ๋ ์ด์๋ ์ด N๊ฐ์ ๊ฐ์๊ฐ ๋ค์ด๊ฐ๋๋ฐ, ๋ธ๋ฃจ๋ ์ด๋ฅผ ๋ นํํ ๋, ๊ฐ์์ ์์๊ฐ ๋ฐ๋๋ฉด ์ ๋๋ค. ์์๊ฐ ๋ค๋ฐ๋๋ ๊ฒฝ์ฐ์๋ ๊ฐ์์ ํ๋ฆ์ด ๋๊ฒจ, ํ์๋ค์ด ๋ํผ๋์ ๋น ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, i๋ฒ ๊ฐ์์ j๋ฒ ๊ฐ์๋ฅผ ๊ฐ์ ๋ธ๋ฃจ๋ ์ด์ ๋ นํํ๋ ค๋ฉด i์ j ์ฌ์ด์ ๋ชจ๋ ๊ฐ์๋ ๊ฐ์ ๋ธ๋ฃจ๋ ์ด์ ๋ นํํด์ผ ํ๋ค.
๊ฐํ ๋ ์ด ๋ธ๋ฃจ๋ ์ด๊ฐ ์ผ๋ง๋ ํ๋ฆด์ง ์์ง ์ ์ ์๊ธฐ ๋๋ฌธ์, ๋ธ๋ฃจ๋ ์ด์ ๊ฐ์๋ฅผ ๊ฐ๊ธ์ ์ค์ด๋ ค๊ณ ํ๋ค. ์ค๋ ๊ณ ๋ฏผ ๋์ ๊ฐํ ๋ M๊ฐ์ ๋ธ๋ฃจ๋ ์ด์ ๋ชจ๋ ๊ธฐํ ๊ฐ์ ๋์์์ ๋ นํํ๊ธฐ๋ก ํ๋ค. ์ด๋, ๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ(๋ นํ ๊ฐ๋ฅํ ๊ธธ์ด)๋ฅผ ์ต์๋ก ํ๋ ค๊ณ ํ๋ค. ๋จ, M๊ฐ์ ๋ธ๋ฃจ๋ ์ด๋ ๋ชจ๋ ๊ฐ์ ํฌ๊ธฐ์ด์ด์ผ ํ๋ค.
๊ฐํ ์ ๊ฐ ๊ฐ์์ ๊ธธ์ด๊ฐ ๋ถ ๋จ์(์์ฐ์)๋ก ์ฃผ์ด์ง๋ค. ์ด๋, ๊ฐ๋ฅํ ๋ธ๋ฃจ๋ ์ด์ ํฌ๊ธฐ ์ค ์ต์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฐ์์ ์ N (1 โค N โค 100,000)๊ณผ M (1 โค M โค N)์ด ์ฃผ์ด์ง๋ค. ๋ค์ ์ค์๋ ๊ฐํ ์ ๊ธฐํ ๊ฐ์์ ๊ธธ์ด๊ฐ ๊ฐ์ ์์๋๋ก ๋ถ ๋จ์๋ก(์์ฐ์)๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ๊ฐ์์ ๊ธธ์ด๋ 10,000๋ถ์ ๋์ง ์๋๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฐ๋ฅํ ๋ธ๋ฃจ๋ ์ด ํฌ๊ธฐ์ค ์ต์๋ฅผ ์ถ๋ ฅํ๋ค.
์ค๋ฒ1.
์ด์งํ์์ ๋ ์ด๋ ต๋ค
ํญ์ ๋ญ ์ต์๊ฐ, ์ค๊ฐ๊ฐ, ์ต๋๊ฐ์ผ๋ก ์ก์์ผํ๋์ง ํท๊ฐ๋ฆผ
+ 3/29 ์ดํด์๋ฃ
์ด์ ฏ๋ฐค์ ์๋ฉด์ ์๊ฐํด๋ดค๋๋ฐ ์ดํดํด๋ฒ๋ ธ์
1 | 2 | 3 | 4 | 5 | 6 | 7 | ... | 27 | 28 |
์ ํ๋ฅผ ๋ด๋ฐ
๋ง์ฝ์ ํ์ผ์ด 7๊ฐ์ด๊ณ ํ์ผ ํฌ๊ธฐ๋ฅผ 1๋ถํฐ 7๊น์ง ์ ๋ ฅ๋ฐ๊ฒ ๋๋ฉด,
๋ธ๋ฃจ๋ ์ด ํ๋์ ์ต์ ์ฉ๋์ 7์ด์ด์ผํจ. ์๋๋ฉด ํ ํ์ผ์ ์ชผ๊ฐ์ ๋ด์ ์ ์๊ฑฐ๋
๊ทธ๋ฆฌ๊ณ ๋ธ๋ฃจ๋ ์ด ํ๋์ ์ต๋ ์ฉ๋์ 28์ด๊ฒ ์ง. ์๋๋ฉด 7๊ฐ ํ์ผ์ ๋ค ํฉ์ณ์ ํ๋ฒ์ ๋ฃ์ ์ ์๋ ์ต์๊ฐ์ด๋๊น.
(1+2+3+4+5+6+7 = 28)
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ๊ตฌํด์ผ ํ ๊ฐ๋ ๋ธ๋ฃจ๋ ์ด์ ์ฉ๋์. ๊ทธ๋๊น ์ ๋ฆฌํ์๋ฉด
1. (์ด์งํ์)์ต์๊ฐ, ์ค๊ฐ๊ฐ, ์ต๋๊ฐ์ผ๋ก ๋ธ๋ฃจ๋ ์ด ์ฉ๋์ ์ฐพ๋ ๊ฑฐ๋ค! ๋ผ๋๊ฑธ ์ ์ ์๊ณ
2. ์ ๋ ฅ๋ฐ์ ์์๋ฅผ ์ง์ผ์ผํ๋๊น sort๋ ํ๋ฉด ์๋๊ตฌ
3. ๋ธ๋ฃจ๋ ์ด ์ฉ๋(mid) * ๋ธ๋ฃจ๋ ์ด ๊ฐ์(cnt) >= ์ด ํ์ผ๋ค์ ์ฉ๋ ํฉ
4. ์ ์์ ์ด์ฉํด์ cnt์ m(์ ๋ ฅ๋ฐ์ ๋ธ๋ฃจ๋ ์ด ๊ฐ์)์ ๋น๊ตํ๋ฉด ๋จ.
5. ๊ทธ๋ฆฌ๊ณ m==cnt์์ ๋ฐ๋ณต๋ฌธ์ ๋ฉ์ถ๋ฉด ์๋จ : ์๋๋ฉด ์ฐ๋ฆฌ๋ ๋ธ๋ฃจ๋ ์ด ํ๋๋น "์ต์" ๊ธธ์ด๋ฅผ ๊ตฌํ ๊ฑฐ๋ผ์! ๋๊น์ง ํ์ํด์ผํ๋ค
๋์ ํ์ด
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n;
int m;
int blue[100001]={0};
int minlen = 0;
int maxlen = 0;
int mid = 0;
int result;
cin >> n >> m;
for (int i = 0; i < n; ++i){
cin >> blue[i];
maxlen += blue[i]; // ์ต๋ ๊ธธ์ด๋ ๋ชจ๋ ๋ฐฐ์ด์ ํฉ
if(minlen < blue[i]) minlen = blue[i]; // ์ต์ ๊ธธ์ด๋ ๊ฐ๋ค์ ์ต๋๊ฐ
}
while(minlen <= maxlen){
mid = (minlen + maxlen) / 2;
int sum = 0;
int cnt = 0;
for (int i = 0; i < n; ++i){
if(sum + blue[i] > mid){ // mid๋ ๋ธ๋ฃจ๋ ์ด ํ๋์ ์ฉ๋
sum = 0;
cnt++;
}
sum += blue[i];
}
cnt++;
if(cnt > m) {
minlen = mid + 1;
}
else if(cnt <= m) {
maxlen = mid-1;
result = mid;
}
// cout << minlen <<" "<<mid<<" "<<maxlen<<"\n";
}
cout << result;
}
์ผ์ ์ด๋ถํ์ ํ๋ฌธ์ ๋ง ๋ ํ๊ณ ๋ค์ด๋ฒ ์์์ ์ฐ๋ฌ ๊ฐ์ผ์ง..
'๐ ์๊ณ ๋ฆฌ์ฆ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++/BOJ] 21318 : ํผ์๋ ธ ์ฒด์กฐ (๋์ ํฉ) (0) | 2023.04.02 |
---|---|
[C++/BOJ] 17179 : ์ผ์ดํฌ ์๋ฅด๊ธฐ (์ด์งํ์) (0) | 2023.03.29 |
[C++/BOJ] 5549 : ํ์ฑ ํ์ฌ (๋์ ํฉ) / ์ฝ์ง ๊ธฐ๋ก (0) | 2023.03.28 |
[C++/BOJ] 13423 : Three Dots (์ด์งํ์) / ์ฝ์ง ๊ธฐ๋ก (0) | 2023.03.27 |
[C++/BOJ] 17609 : ํ๋ฌธ (ํฌํฌ์ธํฐ) / ํ ์คํธ์ผ์ด์ค / ์ฝ์ง ๊ธฐ๋ก (1) | 2023.03.25 |