[uva] 10215 - The Largest/Smallest Box ...

来源:互联网 发布:js读取本地json文件 编辑:程序博客网 时间:2024/05/12 18:42
[uva] 10215 - The Largest/Smallest Box ...

【题目】http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=1156&mosmsg=Submission+received+with+ID+10623575

【题意】分别求x的值使x(W-2x)(L-2x)的值最大和最小

【算法】二分求解

【题解】根据三次函数图像,求导后其最大值在 f ' = 0 ,x在区间(0,-b/2a)单调递减,然后二分求出x。然后最小值从小到大写出来很容易。

【注意】好像是因为UVA特殊的判题系统要在min后加个EPS。受不了。

关于二分精度,判断<0.0001*0.0001应该够了吧。。

【代码】

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define EPS (1E-7)double a,b;double fun(double x){    return a*b-4*(a+b)*x+12*x*x;}double erfen(){    //double low = 0, high = min(2*(a+b)/(a*b),min(a,b)/2.0-0.00001),mid=(low+high)/2.0,x;    double low = 0, high = (a+b)/3.0,mid=(low+high)/2.0,x;    while(low<=high){        mid=(low+high)/2.0;        x=fun(mid);        //printf("%.2f %.2f\n",x,mid);        if(fabs(x)<=EPS)return mid;        if(x>0)low=mid+EPS;        else high=mid-EPS;    }    return mid;}int main(){    while(scanf("%lf%lf",&a,&b)!=EOF)printf("%.3f 0.000 %.3f\n",(double)((int)(erfen()*1000+0.5))/1000.0,min(a,b)/2.0+EPS);    //while(scanf("%lf%lf",&a,&b)!=EOF)printf("%.3f 0.000 %.3f\n",(a+b-sqrt(a*a+b*b-a*b))/6.0+EPS,min(a,b)/2.0+EPS);    return 0;}


 

 

 
原创粉丝点击