https://www.acmicpc.net/problem/17266
๋ฌธ์
์ธํ๋ํ๊ต ํ๋ฌธ ๋ค์ชฝ์๋ ์ด๋์ด ๊ตด๋ค๋ฆฌ๊ฐ ์๋ค. ๊ฒ์์ด ์๋น์ด๋ ๊ธธ์ด ์กฐ๊ธ์ด๋ผ๋ ์ด๋ก๋ค๋ฉด ๊ฐ์ง ์๋๋ค. ๋ฐ๋ผ์ ๊ตด๋ค๋ฆฌ๋ก ๊ฐ๋ฉด ์ต๋จ๊ฑฐ๋ฆฌ๋ก ์ง๊น์ง ๊ฐ์ ์์ง๋ง, ๊ตด๋ค๋ฆฌ๋ ์ด๋ก๊ธฐ ๋๋ฌธ์ ๋น๋น ๋์์ ์ง์ผ๋ก ๊ฐ๋ค. ์ํ๊น๊ฒ ์ฌ๊ธด ์ธ์์ด๋ ๊ตด๋ค๋ฆฌ ๋ชจ๋ ๊ธธ 0~N์ ๋ฐํ๊ฒ ๊ฐ๋ก๋ฑ์ ์ค์นํด ๋ฌ๋ผ๊ณ ์ธ์ฒ๊ด์ญ์์ ๋ฏผ์์ ๋ฃ์๋ค. ์ธ์ฒ๊ด์ญ์์์ ๊ฐ๋ก๋ฑ์ ์ค์นํ ๊ฐ์ M๊ณผ ๊ฐ ๊ฐ๋ก๋ฑ์ ์์น x๋ค์ ๊ฒฐ์ ์ ๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๊ฐ๋ก๋ฑ์ ๋์ด๋งํผ ์ฃผ์๋ฅผ ๋น์ถ ์ ์๋ค. ํ์ง๋ง ๊ฐ์๊ธฐ ์์ฐ์ด ๋ถ์กฑํด์ง ์ธ์ฒ๊ด์ญ์๋ ๊ฐ๋ก๋ฑ์ ๋์ด๊ฐ ๋์์๋ก ๊ฐ๊ฒฉ์ด ๋น์ธ์ง๊ธฐ ๋๋ฌธ์ ์ต์ํ์ ๋์ด๋ก ๊ตด๋ค๋ฆฌ ๋ชจ๋ ๊ธธ 0~N์ ๋ฐํ๊ณ ์ ํ๋ค. ์ต์ํ์ ์์ฐ์ด ๋ค ๋์ด๋ฅผ ๊ตฌํ์. ๋จ ๊ฐ๋ก๋ฑ์ ๋ชจ๋ ๋์ด๊ฐ ๊ฐ์์ผ ํ๊ณ , ์ ์์ด๋ค.
๋ค์ ๊ทธ๋ฆผ์ ๋ณด์.
๊ฐ๋ก๋ฑ์ ๋์ด๊ฐ H๋ผ๋ฉด ์ผ์ชฝ์ผ๋ก H, ์ค๋ฅธ์ชฝ์ผ๋ก H๋งํผ ์ฃผ์๋ฅผ ๋น์ถ๋ค.
๋ค์ ๊ทธ๋ฆผ์ ์์ 1์ ๋ํ ์ค๋ช ์ด๋ค.
๊ฐ๋ก๋ฑ์ ๋์ด๊ฐ 1์ผ ๊ฒฝ์ฐ 0~1์ฌ์ด์ ๊ธธ์ด ์ด๋ก๊ธฐ ๋๋ฌธ์ ์๋น์ด๋ ์ง๋๊ฐ์ง ๋ชปํ๋ค.
์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋์ด๊ฐ 2์ผ ๊ฒฝ์ฐ 0~5์ ๋ชจ๋ ๊ธธ์ด ๋ฐ๊ธฐ ๋๋ฌธ์ ์๋น์ด๋ ์ง๋๊ฐ ์ ์๋ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ๊ตด๋ค๋ฆฌ์ ๊ธธ์ด N ์ด ์ฃผ์ด์ง๋ค. (1 ≤ N ≤ 100,000)
๋ ๋ฒ์งธ ์ค์ ๊ฐ๋ก๋ฑ์ ๊ฐ์ M ์ด ์ฃผ์ด์ง๋ค. (1 ≤ M ≤ N)
๋ค์ ์ค์ M ๊ฐ์ ์ค์นํ ์ ์๋ ๊ฐ๋ก๋ฑ์ ์์น x ๊ฐ ์ฃผ์ด์ง๋ค. (0 ≤ x ≤ N)
๊ฐ๋ก๋ฑ์ ์์น x๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฅ๋ฐ์ผ๋ฉฐ ๊ฐ๋ก๋ฑ์ ์์น๋ ์ค๋ณต๋์ง ์์ผ๋ฉฐ, ์ ์์ด๋ค.
์ถ๋ ฅ
๊ตด๋ค๋ฆฌ์ ๊ธธ์ด N์ ๋ชจ๋ ๋น์ถ๊ธฐ ์ํ ๊ฐ๋ก๋ฑ์ ์ต์ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ค.
ํ์ด
๋ ธ๊ฐ๋ค ๊ตฌํ์ ์๋ ๊ฒ ๊ฐ์์ ํ์ด๋ฅผ ์ข ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ฐ๊ฟจ๋ค.
๊ฐ๋ก๋ฑ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ค์ ์ต๋๊ฐ์ ๊ตฌํ๊ณ ๊ฑฐ๋ฆฌ์ ์ต๋๊ฐ <= height*2 ๊ฐ ๋๊ฒ ํ๋ height์ ์ต์๊ฐ์ ๊ตฌํ๋ค
// Authored by : seondal
// Co-authored by : -
// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// ๊ฐ๋ก๋ฑ์ ์ต์ ๊ธธ์ด
int minHeight(int n, int m, vector<int>&lightPos) {
// ๊ฐ๋ก๋ฑ ๊ฐ๊ฒฉ์ ์ต๋๊ฐ
int maxDist=0;
for(int i=1; i<m; i++)
maxDist = max(maxDist, lightPos[i]-lightPos[i-1]);
// ์ต๋ ๊ฐ๋ก๋ฑ ๊ฐ๊ฒฉ <= height*2 ๊ฐ ๋๊ฒ ํ๋ ์ต์ height ๊ฐ ๊ตฌํ๊ธฐ
int height = 0;
while(true) {
height++;
// 0~์ฒซ๋ฒ์งธ๊ฐ๋ก๋ฑ์์น ๊น์ง ๋น์ถ ์ ์๋๊ฐ?
if(height < lightPos[0])
continue;
// ๋ง์ง๋ง๊ฐ๋ก๋ฑ์์น~n ๊น์ง ๋น์ถ ์ ์๋๊ฐ?
if(height < n-lightPos[m-1])
continue;
// ๊ฐ๋ก๋ฑ ์ฌ์ด ๊ฑฐ๋ฆฌ๋ค์ ๋ค ๋น์ถ ์ ์๋๊ฐ?
int range = height*2; // ๊ฐ๋ก๋ฑ์ด ๋น์ถ ์ ์๋ ๋ฒ์
if(range < maxDist)
continue;
// ์กฐ๊ฑด์ ๋ค ๋ง์กฑํ๋ค๋ฉด
break;
}
return height;
}
int main() {
ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n, m;
cin >> n >> m;
vector<int> lightPos(m, 0); // i๋ฒ์งธ ๊ฐ๋ก๋ฑ์ ์์น
for(int i=0; i<m; i++)
cin >> lightPos[i];
cout << minHeight(n, m, lightPos);
return 0;
}
/*
*/
์ํ์ฐฉ์ค1 - ์๊ฐ์ด๊ณผ
๋ค์๊ณผ ๊ฐ์ด ๋จ์ ๊ตฌํ ๋ฌธ์ ๋ก ํ์ดํ์์ผ๋...
// Authored by : seondal
// Co-authored by : -
// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// ๊ธธ์ ๋ชจ๋ ๊ตฌ๊ฐ์ด ๋ฐ์์ง ์ฌ๋ถ ๋ฆฌํด
bool isBright(int n, vector<bool>&street) {
for(int i=0; i<n; i++)
if(!street[i])
return false;
return true;
}
// ๊ฐ๋ก๋ฑ์ ์ต์ ๊ธธ์ด
int minHeight(int n, int m, vector<int>&lightPos, vector<bool>&street) {
int height = 1;
while(true) {
for(int i=0; i<m; i++){
int left = lightPos[i] - height;
left = left<0 ? 0 : left; // segFault ๋ฐฉ์ง์ฉ
int right = lightPos[i] + height - 1;
right = right>n-1 ? n-1 : right;
// ๊ฐ๋ก๋ฑ ๊ธธ ๋น์ถ๊ธฐ
for(int j=left; j<=right; j++)
street[j] = true;
}
if(isBright(n, street))
return height;
height++;
}
}
int main() {
ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n, m;
cin >> n >> m;
vector<bool> street(n, false);
vector<int> lightPos(m, 0); // i๋ฒ์งธ ๊ฐ๋ก๋ฑ์ ์์น
for(int i=0; i<m; i++)
cin >> lightPos[i];
cout << minHeight(n, m, lightPos, street);
return 0;
}
/*
*/
7%์ฏค์์ ์๊ฐ์ด๊ณผ 8ใ 8
4%์์ ํ๋ ธ์ต๋๋ค ๊ฐ ๋ฌ๋ค๋ฉด
https://www.acmicpc.net/board/view/60316
๋ฅผ ์ฐธ๊ณ ํ์
์๋ ์์ ์์ 4๊ฐ ๋์จ๋ค๋ฉด ์๋๋ค! ๊ฐ๋ก๋ฑ์ด ๋ชจ๋ ์ง์ ์ด ์๋ ๊ตฌ๊ฐ ์ ๋น์ถฐ์ผํ๋ค.
10
2
0 9
'๐๏ธ ICPC Sinchon > Divide and Conquer' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 18222๋ฒ: ํฌ์-๋ชจ์ค ๋ฌธ์์ด (0) | 2024.08.21 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 24460๋ฒ: ํน๋ณ์์ด๋ผ๋ ๋ฐ๊ณ ์ถ์ด (0) | 2024.08.16 |