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일때만 수행
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