๐Ÿ•๏ธ ICPC Sinchon/Divide and Conquer

[BOJ S4][C++] ๋ฐฑ์ค€ 17266๋ฒˆ: ์–ด๋‘์šด ๊ตด๋‹ค๋ฆฌ

์„ ๋‹ฌ 2022. 10. 13. 19:49
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/17266

 

17266๋ฒˆ: ์–ด๋‘์šด ๊ตด๋‹ค๋ฆฌ

์ธํ•˜๋Œ€ํ•™๊ต ํ›„๋ฌธ ๋’ค์ชฝ์—๋Š” ์–ด๋‘์šด ๊ตด๋‹ค๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ฒ์Ÿ์ด ์ƒ๋นˆ์ด๋Š” ๊ธธ์ด ์กฐ๊ธˆ์ด๋ผ๋„ ์–ด๋‘ก๋‹ค๋ฉด ๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๊ตด๋‹ค๋ฆฌ๋กœ ๊ฐ€๋ฉด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋กœ ์ง‘๊นŒ์ง€ ๊ฐˆ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ตด๋‹ค๋ฆฌ๋Š” ์–ด๋‘ก๊ธฐ ๋•Œ๋ฌธ์— ๋น™

www.acmicpc.net

 

๋ฌธ์ œ

์ธํ•˜๋Œ€ํ•™๊ต ํ›„๋ฌธ ๋’ค์ชฝ์—๋Š” ์–ด๋‘์šด ๊ตด๋‹ค๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ฒ์Ÿ์ด ์ƒ๋นˆ์ด๋Š” ๊ธธ์ด ์กฐ๊ธˆ์ด๋ผ๋„ ์–ด๋‘ก๋‹ค๋ฉด ๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๊ตด๋‹ค๋ฆฌ๋กœ ๊ฐ€๋ฉด ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋กœ ์ง‘๊นŒ์ง€ ๊ฐˆ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ตด๋‹ค๋ฆฌ๋Š” ์–ด๋‘ก๊ธฐ ๋•Œ๋ฌธ์— ๋น™๋น™ ๋Œ์•„์„œ ์ง‘์œผ๋กœ ๊ฐ„๋‹ค. ์•ˆํƒ€๊น๊ฒŒ ์—ฌ๊ธด ์ธ์‹์ด๋Š” ๊ตด๋‹ค๋ฆฌ ๋ชจ๋“  ๊ธธ 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

 

 

 

๋ฐ˜์‘ํ˜•