130407周赛 (五)

2014-11-24 03:12:45 · 作者: · 浏览: 12
left + right ) / 2;
printf("%.3f %.3f\n",l,mid);
}
}

double xx1,yy1,xx2,yy2,lx,ly,vd,vb,l;
int main()
{
while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf",&xx1,&yy1,&xx2,&yy2,&lx,&ly,&vd,&vb,&l))
{
if(xx1 == 0 && xx2 == 0 && yy1 == 0 && yy2 == 0 && lx == 0 && ly ==0 && vd == 0 && vb == 0 && l ==0 )
return 0;
double ftime = (double)l / (double)vb ;//子弹飞的时间
double left = ftime ,right = 1e7;
double mid = (left + right ) / 2 ;
while(right - left > 1e-11)
{
mid = (left + right ) / 2 ;
double nowx = xx1 + lx * mid ;//敌人当前位置
double nowy = yy1 + ly * mid ;
double dis = sqrt((xx2 - nowx) * (xx2 - nowx ) + (yy2 - nowy ) * (yy2 - nowy));//俩人的距离
double dis1 = (mid - ftime) * vd ;//需要跑的距离
if(dis1 >= fabs(dis - l))
right = mid ;
else
left = mid ;
}
mid = (left + right ) / 2;
printf("%.3f %.3f\n",l,mid);
}
}


1007 Dome of Circus


三分圆锥的高,求出体积的最小值。记录高和半径。


[cpp]
double a[Max],b[Max],c[Max];
int main()
{
int T ;
cin >> T;
while ( T -- )
{
int n ;
cin >> n ;
for(int i = 0 ; i < n ; i ++)scanf("%lf%lf%lf",a + i ,b + i ,c + i );
double l = 0 , r = 10000 ;
double h = inf , rr = inf;
double ansarea = inf;
while(r - l > 1e-11)
{
double mid = (l + r ) / 2;
double midd = (r + mid ) / 2 ;
double mr = 0 ;
double mmr = 0;
for (int i = 0 ; i < n ; i ++)
{
double mm = sqrt(a[i] * a[i] + b[i] * b[i])* mid / (mid - c[i]);//根据比例关系,求出底面半径
double mmm = sqrt(a[i] * a[i] + b[i] * b[i])* midd / (midd - c[i]);
if(mr < mm) mr = mm ;//更新半径的最大值
if(mmr < mmm )mmr = mmm;
}
double ansmid = mr * mr * PI * mid / 3 ;
double ansmidd = mmr * mmr * PI * midd / 3 ;
if(ansarea > ansmid)
{
ansarea = ansmid;
h = mid;
rr = mr;
}
if(ansarea > ansmidd)
{
ansarea = ansmidd ;
h = midd;
rr =mmr ;
}
if(ansmid > ansmidd)
{
l = mid ;
}
else
{
r = midd;
}
}
printf("%.3f %.3f\n",h,rr);
}
}

double a[Max],b[Max],c[Max];
int main()
{
int T ;
cin >> T;
while ( T -- )
{
int n ;
cin >> n ;
for(int i = 0 ; i < n ; i ++)scanf("%lf%lf%lf",a + i ,b + i ,c + i );
double l = 0 , r = 10000 ;
double h = inf , rr = inf;
double ansarea = inf;
while(r - l > 1e-11)
{
double mid = (l + r ) / 2;
double midd = (r + mid ) / 2 ;
double mr = 0 ;
double mmr = 0;
for (int i = 0 ; i < n ; i ++)
{
double mm = sqrt(a[i] * a[i] + b[i] * b[i])* mid / (mid - c[i]);//根据比例关系,求出底面半径
double mmm = sqrt(a[i] * a[i] + b[i] * b[i])* midd / (midd - c[i]);
if(mr < mm) mr = mm ;//更新半径的最大值
if(mmr < mmm )mmr = mmm;
}
double ansmid = mr * mr * PI * mid / 3 ;
double ansmidd = mmr * mmr * PI * midd / 3 ;
if(ansarea > ansmid)
{
ansarea = ansmid;
h = mid;
rr = mr;
}
if(ansarea > ansmidd)
{
ansarea = ansmidd ;
h = midd;
rr =mmr ;
}
if(ansmid > ansmidd)
{
l = mid ;
}
else