HDU4430 Yukari's Birthday(枚举+二分)

Yukari's Birthday  HDU4430

 

就是枚举+二分:

注意处理怎样判断溢出。。。(因为题目只要10^12)

先前还以为要用到快速幂和等比数列的快速求和(但肯定会超__int64)

而且这样判断会超时的。。。

还有题目中的And it's optional to place at most one candle at the center of the cake. (中间的蜡烛可有可无)

还有观察数据就知道:因为n最大10^12,r最多枚举到40,然后二分k的结果,看是否有符合条件的k存在。

复制代码
 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 const __int64 N=1000010;
 6 __int64 fun1(__int64 k,__int64 r,__int64 n)
 7 {
 8     __int64 s=0,t=k;
 9     for(int i=1;i<=r;i++)
10     {
11         s+=t;
12         if(s > n)//判断在求和的过程中是否已经比n大(可省时很多且不会超__int64)
13             return N*N;
14         t*=k;
15     }
16     return s;
17 }
18 __int64 fun(__int64 r,__int64 n)
19 {
20     if(r == 1)
21         return n;
22     __int64 mid,p,lef=2,rig=N;
23     while(lef <= rig)
24     {
25         mid=(lef+rig)/2;
26         p=fun1(mid,r,n);
27         if(p == n)
28             return mid;
29         if(n > p)
30             lef=mid+1;
31         else
32             rig=mid-1;
33     }
34     return -1;
35 }
36 int main()
37 {
38     __int64 n,p,r,rr,rp;
39     while(scanf("%I64d",&n)!=EOF)
40     {
41         rr=N;rp=N;
42         for(r=1;r<=40;r++)//只要到40就行了
43         {
44             p=fun(r,n);//中间放蜡烛
45             if(p!=-1)
46                 if(r*p < rr*rp || (r*p == rr*rp && r < rr))
47                 {
48                     rr=r;
49                     rp=p;
50                 }
51             p=fun(r,n-1);//中间不放蜡烛
52             if(p!=-1)
53                 if(r*p < rr*rp || (r*p == rr*rp && r < rr))
54                 {
55                     rr=r;
56                     rp=p;
57                 }
58         }
59         printf("%I64d %I64d\n",rr,rp);
60     }
61     return 0;
62 }
复制代码

 

posted on   ~~碾压机  阅读(183)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示