hdu2899 ;
水提,直接三分,其实求导后二分也可以。
#include<iostream>
#include<cstdio>
using namespace std;
double y;
double inline f( long double x)
{
return 6*x*x*x*x*x*x*x+8*x*x*x*x*x*x+7*x*x*x+5*x*x-y*x;
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
cin>>y;
double l,r,m1,m2;
l=0;r=100;
while(r-l>0.000001)
{
m1=l+(r-l)/3;
m2=r-(r-l)/3;
if(f(m1)<f(m2))
{
r=m2;
}
else
{
l=m1;
}
}
printf("%.4lf\n",f(l));
}
return 0;
}
hdu3400 有俩个未知,第一次确定,则第二个函数式先见后增的,而第二个反馈出最小值后,第一个未知也是先见后增的,所以三分套三分(九分??呵呵~)
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct xy
{
double x,y;
};
double inline dis( xy a,xy b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
xy A,B,C,D; int p,q,r;
double inline s(xy a ,xy b)
{
return dis(a,A)/p+dis(a,b)/r+dis(b,D)/q;
}
double f(xy t)
{
xy l,r,m1,m2;
l=C;r=D;
while(dis(r,l)>0.0001)
{
m1.x=l.x+(r.x-l.x)/3;
m1.y=l.y+(r.y-l.y)/3;
m2.x=r.x-(r.x-l.x)/3;
m2.y=r.y-(r.y-l.y)/3;
if(s(t,m1)<s(t,m2))
{
r=m2;
}
else
{
l=m1;
}
}
return s(t,l);
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y,&D.x,&D.y);
scanf("%d%d%d",&p,&q,&r);
xy l,r,m1,m2;
l=A;r=B;
while(dis(r,l)>0.0001)
{
m1.x=l.x+(r.x-l.x)/3;
m1.y=l.y+(r.y-l.y)/3;
m2.x=r.x-(r.x-l.x)/3;
m2.y=r.y-(r.y-l.y)/3;
if(f(m1)<f(m2))
{
r=m2;
}
else
{
l=m1;
}
}
printf("%.2lf\n",f(l));
}
return 0;
}