[UVA 107] The Cat int the Hat 数学公式和细节啊细节

题目大意:猫中生猫。每一只猫里有N只猫。但是产生的N只小猫总高度只有N/(N+1)。已知最大猫高度和最小猫数量,求除最小猫以外的猫的总数和所有猫的总高度。
公式推导如图。

这里写图片描述


几个注意点:
1.比较对数要更精细。1e-6不够,1e-10才够。
2.最后达成的totH这个公式里吧,要算(N/(N+1))^k,分母分子分开就会炸。
3.参考大神的算法。N和k取double型更方便好算一些,转整数要int(x+0.5)。


不难理解也不难推。
但是细节搞到死。
一边吃某小鲜肉的瓜一边搞了一下午才搞出来。
哇擦擦列。

这里写图片描述


#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
    int N,k,W,H;
    int totH,notW;
    double result;
    while(scanf(" %d %d",&H,&W)!=EOF)
    {
        if(W==0&&H==0)break;
        for(N=1;N<=W;N++)
        {
            result=log(W)/log(H)-log(N)/log(N+1);
            //cout<<"test"<<N<<" "<<result<<endl;
            if(fabs(result)<1e-10)break;
        }
        k=int(log(H)/log(N+1)+0.5);
        //cout<<N<<" "<<k<<endl;
        if(N==1){notW=k*N;}
        else notW=int((pow(N,k)-1)/(N-1)+0.5);
        totH=H*(N+1)-int(H*N*pow(1.0*N/(N+1),k)+0.5);
        printf("%d %d\n",notW,totH);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值