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 space-separated real-valued 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 small-input file gave correct results but the program terminated during large-input 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(i-1)>vec.elementAt(i)){ return fun(farmTime, rate); } else { return vec.elementAt(i-1); } } public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new FileReader("d:\\B-large-practice.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 large-inputs):
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:\\B-large-practice.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(i-1)<vec.elementAt(i)){ result = vec.elementAt(i-1); break; } } System.out.println(result); bw.write("Case #"+index+": "+result); bw.newLine(); bw.flush(); index++; } } }
Your Answer
More puzzles to try-
King Rooks Riddle
You are playing as white and given four rooks to checkmate the black king in four moves with the following ...Read More »Mechanical Computer riddle
The Puzzlefry mechanical computer is a very sensitive device, it consists of interlocked toothed gear cogs. The largest Cog has ...Read More »Goes through a door
It goes through a door, but never goes in or comes out. What is it?Read More »Number Game for Kids
I know there are two methods by using three time the same number with a plus(+) operator , you can ...Read More »How can i determine which of the guest is right ?
I organized a small get together at my home. In the party , i have a barrel with some whiskey ...Read More »Magical circle trap puzzle
Suppose you are trapped by a witch in a magical circle of radius 100 feet. Whenever you try to move ...Read More »Create Number
Create a four digit number in which the first digit is one fourth of the last digit, Second digit is ...Read More »Car and Ice Cream
John bought a new car. He has a habit of eating ice cream from a particular ice cream shop while ...Read More »Ghosts are bad
Why are ghosts bad liars?Read More »Find the odd
Which of the below owl is odd one out?Read More »Get a Sum of 99
Use only one mathematical symbol and all numbers (0-9) to get a sum of 99Read More »Arab Financial Riddle
Two Arabs, one of whom is carrying 5 slices of bread, and the other one carrying 3 slices of bread, ...Read More »Green but no leprechaun Riddle
It is green but not a leprechaun It has lights but It is not a car It has a skirt ...Read More »Compile the Pictogram
What does below pictogram mean?Read More »Get wetter the more it dries riddle
What gets wetter and wetter the more it dries?Read More »Where is Thomas going wrong?
Thomas has missed an excessive number of days of school, so he must meet with Principal Davis. Mr. Davis asks ...Read More »Maximum run in cricket puzzle
In a one day cricket match, There were no wide balls, no wides, no extras and no overthrows. What is ...Read More »prisoner & marble riddle
A prisoner fate will be determined by a game. there are two jars, one with 100 white marbles, and one ...Read More »Painted or Bared
It can be painted or can be left bared. It can be long or can be short. I can be ...Read More »You are sleeping and you are hungry puzzle
You are sleeping and you are hungry, you have Bread, Butter, Jam and cheese in the fridge. What will you ...Read More »