λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
λ°±μ€€/Gold

[BOJ] 24887 : μ΅œλŒ€ν•œμ˜ νœ΄μ‹

by Jaeguk 2022. 3. 30.
문제 링크

24887번: μ΅œλŒ€ν•œμ˜ νœ΄μ‹ (acmicpc.net)

 

24887번: μ΅œλŒ€ν•œμ˜ νœ΄μ‹

Amel은 SKH νšŒμ‚¬ λ‚΄μ—μ„œ 일을 μž˜ν•˜κΈ°λ‘œ μ†Œλ¬Έλ‚œ 유λŠ₯ν•œ 사원이닀. κ·ΈλŸ¬λ‚˜, 체λ ₯이 맀우 μ•ˆ 쒋은 Amel은 ν•˜λ£¨ λ™μ•ˆ μΌν•˜κ³  λ‚˜λ©΄ λΉ λ₯΄κ²Œ 지쳐버리기 λ•Œλ¬Έμ— ν•œ 번 μΌν•˜κ³  λ‚œ ν›„ κ°€λŠ₯ν•œ 였랜 κΈ°κ°„ λ™μ•ˆ

www.acmicpc.net

μˆ­κ³ ν•œ λŒ€νšŒ DIvision2 E번 문제.

λŒ€νšŒ 당일엔 μ•žμ—μ„œ λ§‰νžˆλŠ” λ°”λžŒμ— 읽어보지도 λͺ»ν–ˆλ‹€ γ…Žγ…Ž;

풀이

μ—°μ†μœΌλ‘œ μ‰° λ‚ μ˜ μ΅œμ†Œκ°’μ˜ μ΅œλŒ€κ°’μ„ κ΅¬ν•˜λŠ” λ¬Έμ œλ‹€. μ—°μ†μœΌλ‘œ μ‰¬λŠ”λ‚ μ˜ μ΅œμ†Œκ°’μ„ μ΄λΆ„νƒμƒ‰μœΌλ‘œ μ°Ύμ•„μ€€λ‹€.

초기 λ²”μœ„λŠ” Left = 0, Right = N 으둜 섀정해쀬닀.

DP배열을 μ„ μ–Έν•΄μ„œ DP[i] μ—°μ†μœΌλ‘œ μ‰¬λŠ”λ‚ μ˜ μ΅œμ†Œκ°€ mid μΌλ•Œ, i번째 λ‚ κΉŒμ§€ μ±„μšΈμˆ˜ μžˆλŠ” ν• λ‹ΉλŸ‰μ˜ μ΅œλŒ€κ°’μ„ μ €μž₯해두 μ—ˆλ‹€. κ·Έλž˜μ„œ DP[N] κΉŒμ§€ ꡬ해쀀뒀 DP[N] >= M(ν• λ‹ΉλŸ‰) 이면 midκ°€ μœ νš¨ν•œ 것이닀.

if(DP[N] >= M)
	L = mid + 1;
else R = mid - 1;

상황을 κ°€μ •ν•΄λ³΄μž. ν˜„μž¬ mid 값이 3μ΄λΌλŠ” 것은 μ—°μ†μœΌλ‘œ 쉴 수 μžˆλŠ” λ‚ μ˜ μ΅œμ†Œκ°’μ΄ 3μΌμ΄λΌλŠ” λœ»μ΄λ‹€.

ν˜„μž¬ i = 5 이닀 DP[5] λ₯Ό μ±„μš°κ³  μžˆλ‹€. 5번째 λ‚ μ—λŠ” 일을 ν•  μˆ˜λ„ 있고 μ•ˆν•  μˆ˜λ„ μžˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 2κ°€μ§€ 경우λ₯Ό λΉ„κ΅ν•΄μ•Όν•œλ‹€.

1. λ§Œμ•½ 일을 ν•œλ‹€λ©΄, μ΅œμ†Œ 3일은 μ‰¬μ–΄μ•Όν•˜κΈ° λ•Œλ¬Έμ—  4일 전인 μ²«λ²ˆμ§Έλ‚ κΉŒμ§€ μ±„μšΈ 수 μžˆλŠ” μ΅œλŒ€ ν• λ‹ΉλŸ‰ + 5번째 λ‚  μ±„μšΈ 수 μžˆλŠ” ν• λ‹ΉλŸ‰.

2. λ§Œμ•½ 일을 μ•ˆν•œλ‹€λ©΄ λ°”λ‘œ μ „λ‚ κΉŒμ§€ μ±„μšΈ 수 μžˆλŠ” ν• λ‹ΉλŸ‰μ˜ μ΅œλŒ€μΈ DP[4] λ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έμ˜¨λ‹€.

DP[5] = max(DP[4], Work[5] + DP[1]) 이 λ˜μ–΄μ•Όν•œλ‹€.

즉, DP[i - 1]κ³Ό DP[i - mid - 1]을 λΉ„κ΅ν•΄μ„œ 더 큰 값을 DP[i]에 μ €μž₯ν•œλ‹€.

λ¬Όλ‘  i - mid - 1이 0보닀 μž‘μ•„μ§€λŠ” κ²½μš°μ—λŠ” μ˜ˆμ™Έλ‹€.

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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<intint>pair<pair<intint>bool>>vector<pair<pair<intint>pair<pair<intint>bool>>>, greater<pair<pair<intint>pair<pair<intint>bool>>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 200000 + 5;
int N, M;
int W[MAX_N];
ll DP[MAX_N];
 
int Binary_search(int L, int R) {
    int ans = 0;
    while (L <= R) {
        int mid = (L + R) / 2;
        for (int i = 1; i <= N; i++) {
            DP[i] = W[i];
            DP[i] = max(DP[i], DP[i-1]);
            if (i > mid)
                DP[i] = max(DP[i], (ll)W[i] + DP[i - mid - 1]);
        }
        if (DP[N] >= M) {
            ans = max(ans, mid);
            L = mid + 1;
            continue;
        }
        else {
            R = mid - 1;
        }
    }
    return ans;
}
 
int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> N >> M;
    ll sum = 0;
    int Max = 0;
    for (int i = 1; i <= N; i++) {
        cin >> W[i];
        sum += W[i];
        Max = max(Max, W[i]);
    }
    if (Max >= M) {
        cout << "Free!\n";
        return 0;
    }
    else if (sum < M) {
        cout << -1 << "\n";
        return 0;
    }
    cout << Binary_search(0, N) << "\n";
    return 0;
}
cs

μ΄λ²ˆμ—λ„ λ²”μœ„λ₯Ό 잘 μƒκ°ν•˜μ§€ λͺ»ν•˜κ³  long long이 μ•„λ‹Œ int둜 μ„ μ–Έν•΄μ„œ 계속 ν‹€λ ΈμŠ΅λ‹ˆλ‹€λ₯Ό λ°›μ•˜λ‹€. κ·Έλ ‡λ‹€κ³  맀번 long long으둜 μ„ μ–Έν•  μˆ˜λ„ μ—†λ‹€. μ–Έμ œμ―€ long long 인걸 λ°”λ‘œ 인지할 수 μžˆμ„κΉŒ.

728x90

'λ°±μ€€ > Gold' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] 1915 : κ°€μž₯ 큰 μ •μ‚¬κ°ν˜•  (0) 2022.04.04
[BOJ] 24888 : λ…ΈνŠΈ 쑰각  (0) 2022.03.31
[BOJ] 24885 : 주식  (0) 2022.03.29
[BOJ] 17404 : RGB거리 2  (0) 2022.03.22
[BOJ] 15823 : μΉ΄λ“œ 팩 κ΅¬λ§€ν•˜κΈ°  (0) 2022.03.21