ColorfulBoxesAndBalls

Cute_Security15·2025년 11월 24일

알고리즘

목록 보기
19/27

문제

numRed 개의 붉은 상자, 붉은 공이 있고
numBlue 개의 푸른 상자, 푸른 공이 있습니다

각 상자에는 1개의 공만 넣을수 있습니다

붉은 상자에 붉은 공이 있으면 onlyRed 점수
푸른 상자에 푸른 공이 있으면 onlyBlue 점수

나머지 경우는 bothColors 점수를 얻습니다

모든 점수를 더한 합계가 최종 점수가 될때
얻을 수 있는 최고 점수를 리턴

예시 입력

numRed, numBlue, onlyRed, onlyBlue, bothColors
2,      3,       100,     400,      200
2,      3,       100,     400,      300
5,      5,       464,     464,      464
1,      4,       20,      -30,      -10
9,      1,       -1,      -10,      4

예시 출력

1400
1600
4640
-100
0

생각의 변화

탐색범위를 줄이려면

red 는 red 에 있고 blue 는 blue 에 있는걸로 시작

서로 교환 후 값이 커졌는지 작아졌는지 체크

값이 커졌다면 계속 수행
값이 작아졌다면 원래대로

값을 별도로 체크할 필요는 없다

red 를 줄이면서

red--
blue--
mix+=2

둘다 양수거나 0일때만 수행

pseudo code

getMaximum(numRed, numBlue, onlyRed, onlyBlue, bothColors)
    r = numRed
    b = numBlue
    
    ret = std::numeric_limits<int>::min()
    
    for i=0  i<=numRed  i++
    
        if r-i >= 0 && b-i >= 0
            next = (r-i) * onlyRed + (b-i) * onlyBlue + (2*i) * bothColors
        
            ret = max(ret, next)

    return ret
profile
관심분야 : Filesystem, Data structure, user/kernel IPC

0개의 댓글