[Google Codejam] Qualification Round 2014-Cookie Clicker Alpha
문제 link : https://code.google.com/codejam/contest/2974486/dashboard#s=p1
Magic Trick 에 이어 두번째 문제, Magic Trick 에 비하면 난이도가 있지만 쉬이 풀수 있는 문제이다.
이 문제의 결론은 X 값으로 주어진 cookie 의 개수를 가장 빠른 시간에 만들 수 있도록 하고 그 시간을 답으로 갖게 하는 것이다.
3 가지의 input 이 주어지는데,
C : farm 을 하나 만들 수 있는 cookie 의 개수
F : farm 하나 당 cookie 생산량
X : 최종으로 만들어야 하는 cookie 의 개수
문제의 link 를 보면 예제가 나와있다.
예제를 보면, 초기 cookie 생산량은 초당 "2" 이다.
가정 C = 500.0, F = 4.0, X = 2000.0
1. cookie 0개에서 부터 초당 2개씩 cookie 가 생산된다.
2. 250초 뒤에, 500개의 cookie 가 생산되고 farm 하나를 구입할 수 있다. 구입하게 되면 초당 4개의 cookie 를
생산하는 farm 을 만들 수 있다.
3. farm 을 하나 만들자. 그렇다면 보유하고 있던 cookie 의 개수는 0이 되고 초당 cookie 의 생산량은 6개가 된다.
4. 다음 farm 을 만들 수 있는 cookie 500개를 초당 6개씩 생산하였을 때, 83.3333333 초가 된다.
5. 83.333333 초 뒤에 farm 을 하나더 만들자. 그러면 다시 보유하고 있던 cookie 의 개수는 0이되고, 초당
10개의 cookie 생산량을 갖게된다.
6. 다음 farm 을 만들 수 있는 시간은 50초가 된다.
7. 3번째 farm 을 만들자. 다시 보유하고 있던 cookie 는 0이 되고, 생산량은 14개가 된다.
8. 생산량 14개에서 다음 farm 을 만들 필요는 없다. 왜냐 하면 이 이후의 생산량 증가는 2000개에 도달하는 시간이 점점 커진다. 이제 2000 개를 만들어 보자. 그러면 142.8571429 초가 걸린다.
총 시간은 250 + 83.3333333 + 50 + 142.8571429 = 526.1904762 초가 답이 된다.
앞서 쓴데로, C, F, X 가 input으로 주어지고 결과는 소수점 8자리에서 반올림하여 7자리를 만들면 된다.
중요한 점은,
farm 을 만들 것인지 만들지 않고 그냥 cookie 생산을 할 것인지 결정해야 하는 순간이 있다. 7번에서 8번으로 넘어갈때.
이것은 전 단계에서 X 까지 cookie 를 생산하여 걸린 시간과 현재 단계에서 farm 을 만들지 않고 cookie을 target 까지 생산한 값을 비교하여 전 단계에서 시간이 더 짧게 걸렸다면 farm을 만들지 않고 X 값까지 cookie 만든 시간을 return 하면 될 것이다.
코드를 보자.
def CalculateCookies(cookies, extra, target): cookieGen = 2 # default cookie if cookies > target: return target/cookieGen farmTime = 0.0 prevEndTime = farmTime + target / cookieGen totalTimeFarm = 0.0 while True: totalTimeFarm = totalTimeFarm + \ cookies / (cookieGen + extra * farmTime) farmTime = farmTime + 1.0 currentEndTime = totalTimeFarm + \ target / (cookieGen + extra * farmTime) if prevEndTime < currentEndTime: break; prevEndTime = currentEndTime return prevEndTime if __name__ == "__main__": testcases = input() for caseNr in xrange(1, testcases + 1): cookies, extra, target = map(float, raw_input().split()) timeForCookies = CalculateCookies(cookies, extra, target) print "Case #%d: %.7f"% (caseNr, round(timeForCookies, 8))
코드가 간단하다. 계산만 잘하면 풀수 있는 문제일 것이다.
'Algorithm' 카테고리의 다른 글
[GitHub] Algorithm 문제 풀기(TopCoder, Hackerrank) (1) | 2015.11.27 |
---|---|
[Google Codejam] Qualification Round 2014-Magic Trick (0) | 2014.04.30 |
[Algorithm] Python 배우기 (0) | 2013.10.09 |
[Alogithm Practice] CodeChef 소개 (0) | 2013.05.15 |