๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐฑ์ค€/Gold

[BOJ] 1806 : ๋ถ€๋ถ„ํ•ฉ

by Jaeguk 2022. 2. 2.
๋ฌธ์ œ ๋งํฌ

1806๋ฒˆ: ๋ถ€๋ถ„ํ•ฉ (acmicpc.net)

 

1806๋ฒˆ: ๋ถ€๋ถ„ํ•ฉ

์ฒซ์งธ ์ค„์— N (10 ≤ N < 100,000)๊ณผ S (0 < S ≤ 100,000,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ˆ˜์—ด์˜ ๊ฐ ์›์†Œ๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์ ธ ์žˆ์œผ๋ฉฐ, 10,000์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

www.acmicpc.net

ํ’€์ด

๋ถ€๋ถ„์ˆ˜์—ด์˜ ํ•ฉ์ด S์ด์ƒ ๋˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด์ค‘ ๊ฐ€์žฅ ์งง์€ ๊ธธ์ด๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ.

๊ณจ๋“œ์ด์ƒ์—” ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ํ‘ธ๋Š” ๋ฌธ์ œ๋Š” ๊ฑฐ์˜ ์—†๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์ด๊ฒƒ๋„ ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ํ’€๋ฉด ๋‹น์—ฐํžˆ ์‹œ๊ฐ„์ดˆ๊ณผ.

์ž„์˜์˜ ์ธ๋ฑ์Šค i ์—์„œ i + a ๊นŒ์ง€์˜ ๋ถ€๋ถ„ํ•ฉ์„ ์–ด๋–ป๊ฒŒ ๋น ๋ฅด๊ฒŒ ๊ตฌํ• ๊นŒ

๋ฐ˜๋ณต๋ฌธ์œผ๋กœ i๋ถ€ํ„ฐ i+a๊นŒ์ง€ ๋”ํ•œ๋‹ค? ํšจ์œจ์ด ๋–จ์–ด์ง„๋‹ค

Sum์ด๋ผ๋Š” ๋ฐฐ์—ด์— ๊ฐ ์ธ๋ฑ์Šค๊นŒ์ง€์˜ ํ•ฉ์„ ์ €์žฅํ•œ ๋‹ค์Œ Sum[i+a] - Sum[i-1]์„ ํ•˜๋ฉด O(1)๋งŒ์— ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ๋ถ€๋ถ„์ˆ˜์—ด์˜ ๊ธธ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด๋ถ„ํƒ์ƒ‰์„ ํ•œ๋‹ค.

๊ธธ์ด๊ฐ€ 1์ธ ๋ถ€๋ถ„์ˆ˜์—ด ์ฆ‰ S๋ณด๋‹ค ํฐ ๊ฐ’์ด ๊ทธ๋ƒฅ ๋ฐฐ์—ด์— ์กด์žฌํ•œ๋‹ค๋ฉด ์ž…๋ ฅ๋ฐ›์„ ๋•Œ ํŒ๋ณ„ํ•ด์„œ ๋๋‚ธ๋‹ค.

๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ตœ์†Œ ๊ธธ์ด์ธ 2๋ถ€ํ„ฐ ์ตœ๋Œ€๊ธธ์ด N ๊นŒ์ง€๋ฅผ ํƒ์ƒ‰ (Left = 2, Right = N)

๊ธธ์ด๊ฐ€ mid์ธ ๋ถ€๋ถ„ํ•ฉ์ด S์ด์ƒ์ธ ๋ถ€๋ถ„์ˆ˜์—ด์ด ์กด์žฌํ•˜๋ฉด ๊ธธ์ด๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด R = mid - 1.

์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธธ์ด๋ฅผ ๋Š˜๋ฆฌ๊ธฐ ์œ„ํ•ด L = mid + 1. ์ด๋ ‡๊ฒŒ ํƒ์ƒ‰ํ•˜๋ฉด ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef priority_queue <pair<pair<intint>int>vector<pair<pair<intint>int>>, greater<pair<pair<intint>int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 100000 + 5;
int N,S;
int ans = INF;
vector<int> V;
ll sum[MAX_N];
int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> S;
    V.push_back(0);
    for (int i = 0; i < N; i++) {
        int num;
        cin >> num;
        if (S <= num) {
            cout << "1" << "\n";
            return 0;
        }
        V.push_back(num);
    }
    sum[0= 0;
    for (int i = 1; i <= N; i++) {
        sum[i] = sum[i - 1+ V[i];
    }
    if (sum[N] < S) {
        cout << "0" << "\n";
        return 0;
    }
    int L = 2;
    int R = N;
    int ans = INT_MAX;
    while (L <= R) {
        int mid = (L + R) / 2;
        bool chk = false;
        for (int i = 0; i <= N - mid; i++) {
            if (sum[i + mid] - sum[i] >= S) {                
                chk = true;
                break;
            }
        }
        if (chk) {
            R = mid - 1
            ans = min(ans,mid);
        }
        else L = mid + 1;
    }
    cout << ans<< "\n";
    return 0;
}
cs

์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ์—†์ด ํ†ต๊ณผ

728x90

'๋ฐฑ์ค€ > Gold' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[BOJ] 11066 : ํŒŒ์ผ ํ•ฉ์น˜๊ธฐ  (0) 2022.02.07
[BOJ] 1450 : ๋ƒ…์ƒ‰๋ฌธ์ œ  (0) 2022.02.04
[BOJ] 2470 : ๋‘ ์šฉ์•ก  (0) 2022.02.02
[BOJ] 10217 : KCM Travel  (0) 2022.01.27
[BOJ] 9370 : ๋ฏธํ™•์ธ ๋„์ฐฉ์ง€  (0) 2022.01.24