𝘚𝘭𝘰𝘸 𝘣𝘢𝘡 𝘴𝘡𝘦𝘒π˜₯𝘺

[λ°±μ€€] 15486번: 퇴사 2 - C++ λ³Έλ¬Έ

μ½”λ”©ν…ŒμŠ€νŠΈ μ€€λΉ„/λ°±μ€€

[λ°±μ€€] 15486번: 퇴사 2 - C++

.23 2022. 7. 7. 16:50
문제

μƒλ‹΄μ›μœΌλ‘œ μΌν•˜κ³  μžˆλŠ” λ°±μ€€μ΄λŠ” 퇴사λ₯Ό ν•˜λ €κ³  ν•œλ‹€.

μ˜€λŠ˜λΆ€ν„° N+1일째 λ˜λŠ” λ‚  퇴사λ₯Ό ν•˜κΈ° μœ„ν•΄μ„œ, 남은 N일 λ™μ•ˆ μ΅œλŒ€ν•œ λ§Žμ€ 상담을 ν•˜λ €κ³  ν•œλ‹€.

λ°±μ€€μ΄λŠ” λΉ„μ„œμ—κ²Œ μ΅œλŒ€ν•œ λ§Žμ€ 상담을 작으라고 뢀탁을 ν–ˆκ³ , λΉ„μ„œλŠ” ν•˜λ£¨μ— ν•˜λ‚˜μ”© μ„œλ‘œ λ‹€λ₯Έ μ‚¬λžŒμ˜ 상담을 μž‘μ•„λ†“μ•˜λ‹€.

각각의 상담은 상담을 μ™„λ£Œν•˜λŠ”λ° κ±Έλ¦¬λŠ” κΈ°κ°„ Ti와 상담을 ν–ˆμ„ λ•Œ 받을 수 μžˆλŠ” κΈˆμ•‘ Pi둜 이루어져 μžˆλ‹€.

N = 7인 κ²½μš°μ— λ‹€μŒκ³Ό 같은 상담 μΌμ •ν‘œλ₯Ό 보자.

  1일 2일 3일 4일 5일 6일 7일
Ti 3 5 1 1 2 4 2
Pi 10 20 10 20 15 40 200

1일에 μž‘ν˜€μžˆλŠ” 상담은 총 3일이 걸리며, μƒλ‹΄ν–ˆμ„ λ•Œ 받을 수 μžˆλŠ” κΈˆμ•‘μ€ 10이닀. 5일에 μž‘ν˜€μžˆλŠ” 상담은 총 2일이 걸리며, 받을 수 μžˆλŠ” κΈˆμ•‘μ€ 15이닀.

상담을 ν•˜λŠ”λ° ν•„μš”ν•œ 기간은 1일보닀 클 수 있기 λ•Œλ¬Έμ—, λͺ¨λ“  상담을 ν•  μˆ˜λŠ” μ—†λ‹€. 예λ₯Ό λ“€μ–΄μ„œ 1일에 상담을 ν•˜κ²Œ 되면, 2일, 3일에 μžˆλŠ” 상담은 ν•  수 μ—†κ²Œ λœλ‹€. 2일에 μžˆλŠ” 상담을 ν•˜κ²Œ 되면, 3, 4, 5, 6일에 μž‘ν˜€μžˆλŠ” 상담은 ν•  수 μ—†λ‹€.

λ˜ν•œ, N+1μΌμ§Έμ—λŠ” νšŒμ‚¬μ— μ—†κΈ° λ•Œλ¬Έμ—, 6, 7일에 μžˆλŠ” 상담을 ν•  수 μ—†λ‹€.

퇴사 전에 ν•  수 μžˆλŠ” μƒλ‹΄μ˜ μ΅œλŒ€ 이읡은 1일, 4일, 5일에 μžˆλŠ” 상담을 ν•˜λŠ” 것이며, μ΄λ•Œμ˜ 이읡은 10+20+15=45이닀.

상담을 적절히 ν–ˆμ„ λ•Œ, 백쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ μˆ˜μ΅μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯

첫째 쀄에 N (1 ≤ N ≤ 1,500,000)이 주어진닀.

λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 Ti와 Piκ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄μ„œ 주어지며, 1일뢀터 NμΌκΉŒμ§€ μˆœμ„œλŒ€λ‘œ 주어진닀. (1 ≤ Ti ≤ 50, 1 ≤ Pi ≤ 1,000)

 

좜λ ₯

첫째 쀄에 백쀀이가 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡을 좜λ ₯ν•œλ‹€.


πŸ”— 14501번: 퇴사와 λ™μΌν•œ 문제

κ·ΈλŸ¬λ‚˜ N이 15μ˜€λ˜ 14501번과 달리 이번 λ¬Έμ œλŠ” 1,500,000이기 λ•Œλ¬Έμ— μ™„μ „ λ™μΌν•œ λ°©μ‹μœΌλ‘œ ν’€λ©΄ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚œλ‹€.

λ”°λΌμ„œ for문이 ν•˜λ‚˜μ§œλ¦¬μΈ ν’€μ΄λ°©μ‹μœΌλ‘œ λ°”κΏ”μ„œ ν’€μ–΄μ€€λ‹€.

 

상담 일정이 λ‹΄κΈ΄ λ°°μ—΄ schedule[N][2]을 μ°Έκ³ ν•˜μ—¬ ν˜„μž¬ λ‚ μ§œκΉŒμ§€ 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡을 λ‹΄μ•„λ‘λŠ” λ°°μ—΄ result[N]을 μž‘μ„±ν•œλ‹€.

λ”°λΌμ„œ i번째 μΌκΉŒμ§€ μΌν–ˆμ„ λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡은 result[i]라고 ν•  λ•Œ,

i번째 날에 일을 μ‹œμž‘ν•΄μ„œ (i + schedule[i][0])μΌκΉŒμ§€ μΌν–ˆμ„ λ•Œ 얻을 수 μžˆλŠ” μ΅œλŒ€ 이읡과 기쑴에 μ‘΄μž¬ν•˜λŠ” result[i + schedule[i][0]]값을 λΉ„κ΅ν•˜μ˜€μ„ λ•Œ 더 큰 값이 곧 (i + schedule[i][0])μΌκΉŒμ§€ μΌν–ˆμ„ λ•Œμ˜ μ΅œλŒ€ 이읡이 λœλ‹€.

 

μ½”λ“œ
#include <cstdio>
#define MAX 1500051

int schedule[MAX][2];
int result[MAX];

int max(int a, int b) {
    return (a > b ? a : b);
}

void DP(int num);

int main(void) {
    int N;
    scanf("%d", &N);

    DP(N);
    return 0;
}

void DP(int num) {
    int maximum = 0;
    int current = 0;

    for(int i = 1; i <= num; i++) {
        scanf("%d %d", &schedule[i][0], &schedule[i][1]);
    }

    for(int i = 1; i <= num + 1; i++) {
        current = max(current, result[i]);

        if(i + schedule[i][0] <= num + 1) {
            result[i + schedule[i][0]] = max(result[i + schedule[i][0]], current + schedule[i][1]);
            maximum = max(maximum, result[i + schedule[i][0]]);
        }
        else continue;
    }

    printf("%d\n", maximum);
}
Comments