您的位置:首页 > 其它

POJ 2194 2850 Stacking Cylinders

2012-07-22 14:52 155 查看
很简单,直接用高中的解析几何知识,将两个与两个圆都想切的圆的圆心求出来就可以了,在加个两重循环找到最上面的点。

#include <stdio.h>
#include <math.h>
#include<algorithm>
using namespace std;
double num[20][20], numy[20][20];

int n;

void getpoint( double x1, double y1, double x2, double y2 , double & x, double & y )
{
double a, b, c, d, e, f;
a= x2-x1;
b= y2-y1;
c= (x1+x2)/2.0;
d= (y1+y2)/2.0;
e= (y1-y2)/2.0;
f= (x1-x2)/2.0;
y=sqrt( (4-e*e-f*f)*a*a/(a*a+b*b) ) + d;
x= ( b*( d-y )/a )+c;
}

int main()
{
int t;
while(scanf("%d", &t) && t)
{
int i, j;
for ( i = 0; i < t ; i++ )
{
scanf("%lf", num[t-1]+i);
numy[t-1][i]=1.0;
}
sort(num[t-1],num[t-1]+t);
for ( j = t-1; j > 0 ; j-- )
{
for ( i = 0; i < t; i++ )
{
getpoint(num[j][i], numy[j][i], num[j][i+1], numy[j][i+1], num[j-1][i], numy[j-1][i]);
}
}
printf("%.4f %.4f\n",num[0][0], numy[0][0]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c