Google_codejam2014_Problem B: Cookie Clicker Alpha

Introduction

Cookie Clicker is a Javascript game by Orteil, where players click on a picture of a giant cookie. Clicking on the giant cookie gives them cookies. They can spend those cookies to buy buildings. Those buildings help them get even more cookies. Like this problem, the game is very cookie-focused. This problem has a similar idea, but it does not assume you have played Cookie Clicker. Please don't go play it now: it might be a long time before you come back.

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:

  1. You start with 0 cookies, but producing 2 cookies per second.
  2. After 250 seconds, you will have C=500 cookies and can buy a farm that producesF=4 cookies per second.
  3. After buying the farm, you have 0 cookies, and your total cookie production is 6 cookies per second.
  4. The next farm will cost 500 cookies, which you can buy after about 83.3333333seconds.
  5. After buying your second farm, you have 0 cookies, and your total cookie production is 10 cookies per second.
  6. Another farm will cost 500 cookies, which you can buy after 50 seconds.
  7. After buying your third farm, you have 0 cookies, and your total cookie production is 14 cookies per second.
  8. 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, TT lines follow. Each line contains three space-separated real-valued numbers: CF and X, whose meanings are described earlier in the problem statement.

CF 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

Code:

//for小数据
#include<stdio.h>
#define MAX 100000000

double compt(double c,double f,double x);
 
int main()
{
 freopen("B-small-practice.in","r",stdin);
 freopen("B-small-practice.out","w",stdout);   

 int t;
 scanf("%d",&t);
 double c,f,x;
 for(int cs=0;cs<t;++cs)
 {
  scanf("%lf %lf %lf",&c,&f,&x);
  printf("Case #%d: %.9lf\n",cs+1,compt(c,f,x));       
 }//for
 return 0;   
}

double compt(double c,double f,double x)
{
 int n=(int)((x-2)/f)+1;
 double time=0;
 double min=x/2;
 double pre=MAX;
 //printf("c:%lf f:%lf x:%lf\n",c,f,x);
 for(int j=1;j<100000;++j)
 {
  //fprintf(stderr,"j:%d\n",j);
  time=0;
  for(int k=0;k<j;++k)
  {
   time=time+c/(2+k*f);       
  }
  time+=x/(2+j*f);
  //fprintf(stderr,"time:%lf\n",time);
  min=time<min?time:min;
  if(time>pre) return min;
  pre=time; 
 }      
 return min;
}


在小数据的双层循环中,每次j增大时,是有重复计算的;所以其实只用在上一结果的基础上加上一个增量就行了。

我做小数据的时候,把n的范围给限定错了,结果incorrect多次。。这题应该可以过的。。。唉,头有点晕,思考不给力啊

n可以不限定,也可以限定到x/c。(我由x>=2+n*f来限定n,不知道怎么想的。结果 很多数据过得了但WA,错误难找,这说明,下次类似情况时,可以考虑一些判断条件是否正确


//for大数据
#include<stdio.h>

double compt(double c,double f,double x);
 
int main()
{
 freopen("B-large-practice.in","r",stdin);
 freopen("B-large-practice.out","w",stdout);   

 int t;
 scanf("%d",&t);
 double c,f,x;
 for(int cs=0;cs<t;++cs)
 {
  scanf("%lf %lf %lf",&c,&f,&x);
  printf("Case #%d: %.9lf\n",cs+1,compt(c,f,x));       
 }//for
 return 0;   
}

double compt(double c,double f,double x)
{
 int n=(int)((x-2)/f)+1;
 double time=0;
 double min=x/2;
 for(int j=0;j<100000;++j)
 {
  if(time+x/(2+j*f)<min) min=time+x/(2+j*f);
  time+=c/(2+j*f);
 }      
 return min;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值