POJ - 2194
2015-09-24 20:29
232 查看
给你一排圆,然后一排一排网上叠,求最上面那个圆的圆心,
求上面那排圆的圆心可以用旋转然后求直线的交点
求上面那排圆的圆心可以用旋转然后求直线的交点
#include <iostream> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <cmath> #include <vector> #include <algorithm> using namespace std; #define eps 1e-10 struct point { double x, y; point (double xx = 0, double yy = 0) { x =xx, y = yy; } point operator - (const point &b) const { return point(x - b.x, y - b.y); } double operator ^ (const point &b) const { return x*b.y - b.x*y; } double operator * (const point &b) const { return x*b.x + y*b.y; } }; int sgn(double x) { if(fabs(x) < eps) return 0; if(x > 0) return 1; return -1; } struct Line { point s, e; Line(){}; Line(point a, point b) { s = a, e = b; } point operator &(const Line &b) const { point res = s; if(sgn((s - e)^(b.s - b.e)) == 0) return res; double t = ((s - b.s)^(b.s - b.e))/((s - e)^(b.s - b.e)); res.x += (e.x - s.x)*t; res.y += (e.y - s.y)*t; return res; } }; vector<point> sta[11]; int cmp(point a, point b) { return a.x < b.x; } double getdis(point a, point b) { return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y)); } point Rotate(point p, double angle) { point res; res.x = p.x*cos(angle) - p.y*sin(angle); res.y = p.x*sin(angle) + p.y*cos(angle); return res; } void solve(int n) { for( int i = n - 1; i > 0; i--) { sta[i].clear(); for( int j = 0; j < i; j++) { point a = sta[i+1][j]; point b = sta[i+1][j+1]; // cout<<a.x<<" -- "<<a.y<<endl; //cout<<b.x<<" -- "<<b.y<<endl; double len = getdis(a, b); double angle = acos(len/4.0); // cout<<" -- "<<angle<<endl; point aa = Rotate(a-b,-angle); aa.x += b.x, aa.y += b.y; point bb = Rotate(b-a, angle); bb.x += a.x, bb.y += a.y; Line l1 = Line(aa,b); Line l2 = Line(bb,a); point p = l1&l2; // cout<<p.x<<" -- "<<p.y<<endl; sta[i].push_back(p); } } } int main() { int n; while(scanf("%d",&n) != EOF && n) { point res; sta .clear(); for( int i = 0; i < n; i++) { scanf("%lf",&res.x); res.y = 1; sta .push_back(res); } sort(sta .begin(), sta .end(), cmp); solve(n); printf("%.4f %.4f\n",sta[1][0].x, sta[1][0].y); } return 0; }
相关文章推荐
- POJ ACM 1001
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management
- 用单调栈解决最大连续矩形面积问题
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- POJ 1200 Crazy Search(简单哈希)
- 【高手回避】poj3268,一道很水的dijkstra算法题
- POJ 1088 滑雪
- poj2387 Til the Cows Come Home—Dijkstra模板
- poj 2485 Highways