HDOJ 5984 Pocky【2016青岛现场赛】【数学】

其实这个题可以用看数据样例的方法来猜!!!!!!

(不然现场赛几分钟就过了这个题是怎么过的)


先说说题意:有一个长为L的巧克力,我们每次随机的选择一个分割点,将其分成两块,左边的一块吃掉,右边的一块留着,继续分割。

直到剩下的长度不超过D为止。求分割次数的期望


先说说正解:

当L<=D时,一开始分解不了,所以答案是0

当L>D时,分两类情况:

第一种情况,只能分解一次:取的大小超过了L-D

第二种情况:与当前取的值有关

接下来就需要数学队友来个微积分:得到答案为1+ln(L/D)

吐槽一下弱弱的自己:不知道ln怎么打!!!!其实在C++中就是log。。。。



代码就是这样咯:

#include
using namespace std;

const double eps=1e-6;
double a,b,ans;
int n;

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&a,&b);
        if (a<=b+eps) puts("0.000000");
        else printf("%.6lf\n",1.0+log(a/b));
    }
    return 0;
}


怎么猜:

首先看数据:

2.0和1.0

4.0和1.0

8.0和1.0

这些除了1,小数的值是翻倍的!

再看到2.0和1.0,后面那个位数好熟悉啊!不就是ln2吗!

所以此时就知道答案与ln有关

再用7.0和3.0检验一发,卧槽,这个题怎么这么水?!

(这个之后赛后自己YY的,但是其实赛场上有大神就是这么做的)


所以:提供几个数学值放在这儿:

log10(2):0.301030
log10(3):0.477121
log10(5):0.698970
log10(7):0.845098
ln(2):0.693147
ln(3):1.098612
ln(5):1.609438
ln(7):1.945910

比如要算log10(6):

因为知道log10(2)和log10(3):所以加起来就知道了log10(6)=0.778151

你可能感兴趣的:(ACM题解,数学)