hdu 2289 基础二分

本以为二分的题嘛,有了模板一切都好说,这道题发出来其实有抄袭的嫌疑,算是给自己写的纠正性文章了,原来的想法每次二分的条件是相似边比的立方大于体积比,后来发现计算多误差大,然后就变成了所求水的体积大于实际水的体积,结果因为强行套模板,还是错55555.。。所以模板不是看懂会用就行了,还是要懂其中的思想啊。。。

WA:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;//G()h下所求水的体积是否大于实际值 
#define pi acos(-1.0)
#define INF 0x7fffffff
bool G(double r,double R,double H,double h,double v)
{
	double rr=h*(R-r)/H+r;
	if(pi/3*h*(rr*rr+r*r+rr*r)-v>=1e-9)
	return 1;
	else
	return 0;
}
int main()
{
	int t;
	double r,R,H,V;
	double bli;
	double lef=0,rig=INF,mid;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%lf %lf %lf %lf",&r,&R,&H,&V);
		while(rig-lef>1e-9)
		{
			mid=(lef+rig)/2;
			if(!G(r,R,H,mid,V)) lef=mid;
			else rig=mid;
		}
		//cout<<rig<<endl;
		printf("%.6lf\n",floor(mid*1000000)/1000000);
	}
	return 0;
}
大神AC:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
#define PI acos(-1.0)
#define exp 1e-9
double solve(double r,double R,double h,double H)
{
    double u = h/H*(R-r) + r;
    return PI/3*(r*r+r*u+u*u)*h;
}
int main()
{
    int t;
    double r,R,H,V,mid,vv,f,l;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf%lf%lf%lf",&r,&R,&H,&V);
        f=0;
        l=100;
        while(l-f>exp)
        {
            mid=(l+f)/2;
            vv=solve(r,R,mid,H);
            if(fabs(vv-V)<=exp)
                break;
            else if(vv>V)
                l=mid-exp;
            else
                f=mid+exp;
        }
        printf("%.6lf\n",mid);
    }
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值