Cookie Clicker Alpha – Google Code Jam 2014
This was the second problem for Google Code Jam Qualification round 2014, if you are able to solve this problem with the first one(which is very easy) you will be eligible for the next round.
Problem
In this problem, you start with 0 cookies. You gain cookies at a rate of 2 cookies per second, by clicking on a giant cookie. Any time you have at least C cookies, you can buy a cookie farm. Every time you buy a cookie farm, it costs you C cookies and gives you an extra F cookies per second.
Once you have X cookies that you haven’t spent on farms, you win! Figure out how long it will take you to win if you use the best possible strategy.
Example
Suppose C=500.0, F=4.0 and X=2000.0. Here’s how the best possible strategy plays out:
 You start with 0 cookies, but producing 2 cookies per second.
 After 250 seconds, you will have C=500 cookies and can buy a farm that producesF=4 cookies per second.
 After buying the farm, you have 0 cookies, and your total cookie production is 6 cookies per second.
 The next farm will cost 500 cookies, which you can buy after about 83.3333333seconds.
 After buying your second farm, you have 0 cookies, and your total cookie production is 10 cookies per second.
 Another farm will cost 500 cookies, which you can buy after 50 seconds.
 After buying your third farm, you have 0 cookies, and your total cookie production is 14 cookies per second.
 Another farm would cost 500 cookies, but it actually makes sense not to buy it: instead you can just wait until you have X=2000 cookies, which takes about142.8571429 seconds.
Total time: 250 + 83.3333333 + 50 + 142.8571429 = 526.1904762 seconds.
Notice that you get cookies continuously: so 0.1 seconds after the game starts you’ll have 0.2 cookies, and π seconds after the game starts you’ll have 2π cookies.
Input
The first line of the input gives the number of test cases, T. T lines follow. Each line contains three spaceseparated realvalued numbers: C, F and X, whose meanings are described earlier in the problem statement.
C, F and X will each consist of at least 1 digit followed by 1 decimal point followed by from 1 to 5 digits. There will be no leading zeroes.
Output
For each test case, output one line containing “Case #x: y”, where x is the test case number (starting from 1) and y is the minimum number of seconds it takes before you can have X delicious cookies.
We recommend outputting y to 7 decimal places, but it is not required. y will be considered correct if it is close enough to the correct number: within an absolute or relative error of 10^{6}. See the FAQ for an explanation of what that means, and what formats of real numbers we accept.
Limits
1 ≤ T ≤ 100.
Small dataset
1 ≤ C ≤ 500.
1 ≤ F ≤ 4.
1 ≤ X ≤ 2000.
Large dataset
1 ≤ C ≤ 10000.
1 ≤ F ≤ 100.
1 ≤ X ≤ 100000.
Sample
Input  Output 
4 30.0 1.0 2.0 30.0 2.0 100.0 30.50000 3.14159 1999.19990 500.0 4.0 2000.0

Case #1: 1.0000000 Case #2: 39.1666667 Case #3: 63.9680013 Case #4: 526.1904762

So I first solved it through a recursive function. (I still don’t know why I did this stupid thing). So smallinput file gave correct results but the program terminated during largeinput evaluation (stack overflow error). :O
Here is the code (recursive):
import java.io.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class cookie { static int i = 0; static Vector<Double> vec; static double target=0; static double fRate = 0; static double fCost = 0; public static double fun(double prevFarmBuyTimes, double rate){ if(i==0){ vec.add(target/rate); } double farmTime = prevFarmBuyTimes+fCost/rate; rate+=fRate; double WaitingTime = target/rate; double projection = farmTime+WaitingTime; vec.add(projection); i++; if(vec.elementAt(i1)>vec.elementAt(i)){ return fun(farmTime, rate); } else { return vec.elementAt(i1); } } public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new FileReader("d:\\Blargepractice.in")); BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\result.txt")); int ncases = Integer.parseInt(br.readLine()); int index = 1; while(index<=ncases){ Pattern p = Pattern.compile("\\d+.\\d+"); Matcher m = p.matcher(br.readLine()); if (m.find()) fCost = Double.parseDouble(m.group()); if (m.find()) fRate = Double.parseDouble(m.group()); if (m.find()) target = Double.parseDouble(m.group()); //LOGIC STARTS HERE vec = new Vector<Double>(); i=0; double time = fun(0,2); bw.write("Case #"+index+": "+time); bw.newLine(); bw.flush(); System.out.println(time); index++; } } }
And here is the improved version without recursion.(Gives correct results for largeinputs):
import java.io.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; public class cookie { public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new FileReader("d:\\Blargepractice.in")); BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\result.txt")); int ncases = Integer.parseInt(br.readLine()); int index = 1; int i = 0; Vector<Double> vec; double target=0; double fRate = 0; double fCost = 0; while(index<=ncases){ Pattern p = Pattern.compile("\\d+.\\d+"); Matcher m = p.matcher(br.readLine()); if (m.find()) fCost = Double.parseDouble(m.group()); if (m.find()) fRate = Double.parseDouble(m.group()); if (m.find()) target = Double.parseDouble(m.group()); vec = new Vector<Double>(); i=0; double rate =2; vec.add(target/rate); double result = 0; double prevFarmBuyTimes=0; while(true){ double farmTime = prevFarmBuyTimes+fCost/rate; prevFarmBuyTimes=farmTime; rate+=fRate; double WaitingTime = target/rate; double projection = farmTime+WaitingTime; i++; vec.add(projection); if(vec.elementAt(i1)<vec.elementAt(i)){ result = vec.elementAt(i1); break; } } System.out.println(result); bw.write("Case #"+index+": "+result); bw.newLine(); bw.flush(); index++; } } }
Your Answer
More puzzles to try
What is the logic behind these ?
3 + 3 = 3 5 + 4 = 4 1 + 0 = 3 2 + 3 = 4 ...Read More »Which letter replaces the question mark
Which letter replaces the question markRead More »Five greedy pirates and gold coin distribution Puzzle
Five puzzleFry ship’s pirates have obtained 100 gold coins and have to divide up the loot. The pirates are all ...Read More »Defective stack of coins puzzle
There are 10 stacks of 10 coins each. Each coin weights 10 gms. However, one stack of coins is defective ...Read More »Dr. Willam and surgical gloves puzzle
Dr.Willam wants to operate for three different persons who were wounded. But he had only two surgical gloves. There is ...Read More »Which clock works best?
Which clock works best? The one that loses a minute a day or the one that doesn’t work at all?Read More »To which one will the needle touch 1 OR 2
In the gear arrangement, To which one will the needle touch, 1 OR 2Read More »How did he know?
A man leaves his house in the morning to go to office and kisses his wife. In the evening on ...Read More »Which room is safest puzzle
A murderer is condemned to death. He has to choose between three rooms. The first is full of raging fires, ...Read More »Crossing the Bridge Puzzle (Bridge and torch problem)
A bridge will collapse in 17 minutes. 4 people want to cross it before it will collapse. It is a ...Read More »Probability of having boy
In a country where everyone wants a boy, each family continues having babies till they have a boy. After some ...Read More »Magical flowers!!
A devotee goes to three temples, temple1, temple2 and temple3 one after the other. In front of each temple, there ...Read More »How many times a day do all three hands of analog watch overlaps?
There is a perfectly accurate analog watch with hour, minute, and second hands. How many times a day do all three ...Read More »Tuesday, Thursday what are other two days staring with T?
Four days are there which start with the letter ‘T‘. I can remember only two of them as “Tuesday , Thursday”. ...Read More »How could only 3 apples left
Two fathers took their sons to a fruit stall. Each man and son bought an apple, But when they returned ...Read More »How Many Eggs ?
A farmer is taking her eggs to the market in a cart, but she hits a pothole, which knocks over ...Read More »Minimum number of persons needed to cross a Desert
In the middle of the confounded desert, there is the lost city of “Ash”. To reach it, you will have ...Read More »Lateral thinking sequence Puzzle
Solve this logic sequence puzzle by the correct digit 8080 = 6 1357 = 0 2022 = 1 1999 = ...Read More »Pizza Cost Math Brain Teaser
Jasmine, Thibault, and Noah were having a night out and decided to order a pizza for $10. It turned out ...Read More »Overthrow your math teacher!
Some numbers are very mysterious. They are all integers. They have more than one digit. If you multiply them with ...Read More »