[BOJ] 1806 : ๋ถ๋ถํฉ
๋ฌธ์ ๋งํฌ
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<int, int>, int>, vector<pair<pair<int, int>, int>>, greater<pair<pair<int, int>, 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 |
์ด๋ ๊ฒ ํด์ฃผ๋ฉด ์๊ฐ์ด๊ณผ์์ด ํต๊ณผ