题意:求最顶层的圆的坐标.
策略:求出角度a1,a2.则得出a1+a2的角度,通过余弦、正弦求出x,y的增量
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
struct circle
{
double x;
double y;
};
bool com(circle a,circle b)
{
return a.x < b.x;
}
int main()
{
int cases;
int caseid = 0;
cin >> cases;
while(cases--)
{
int n;
caseid++;
cin >> n;
vector<circle> data(n * (n + 1) / 2);
for(int i = 0;i < n;i++)
{
cin >> data[i].x;
data[i].y = 1.0;
}
sort(data.begin(),data.begin() + n,com);
int count = n;
for(int i = n; i > 0;i--)
{
for(int j = 0;j < i - 1;j++)
{
double m1 = data[count - i + 1].x - data[count - i].x;
double m2 = data[count - i + 1].y - data[count - i].y;
double a1 = atan(m2 / m1);
double a2 = acos(sqrt(m1 * m1 + m2 * m2) / 2 / 2);
double a = a1 + a2;
data[count].x = data[count - i].x + 2 * cos(a);
data[count].y = data[count - i].y + 2 * sin(a);
count++;
}
}
cout.precision(4);
cout << caseid << ": " << fixed << data[data.size() - 1].x << " " << fixed << data[data.size() - 1].y << endl;
}
return 0;
}