hdu 5476 Explore Track of Point(2015上海网络赛)
题目链接:hdu 5476
今天和队友们搞出3道水题后就一直卡在这儿了,唉,真惨啊……看着被一名一名地挤出晋级名次,确实很不好受,这道恶心的几何题被我们3个搞了3、4个小时,我想到一半时发现样例输出是 (√2) π / 2 + 1, 于是就各种 YY,无奈尝试了各种方法还是免不了 wa。。。
后来在网上发现,那段圆弧其实就和自己插身而过,真的可以说差一点就想到了,无奈到了最后我们几个都精疲力尽了,好像也想不出什么了。看下图:
就是三角形里的圆弧的长度,设为 Lc ,很容易得出 Lc = | OC | * 2 * ∠O,而 ∠O = ∠ACM,∠ACM可以由 | AM | 与 | CM | 的 atan 值求出,而 | OC | = | CM | / sin(∠O),所以,核心代码就几行而已:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 7 struct point { 8 double x,y; 9 point() {} 10 point(double x, double y): x(x), y(y) {} 11 void read() { scanf("%lf %lf",&x,&y); } 12 void readint() { 13 int x,y; 14 scanf("%d %d",&x,&y); 15 this->x = x; 16 this->y = y; 17 } 18 point operator + (const point &p2) const { 19 return point(x + p2.x, y + p2.y); 20 } 21 point operator - (const point &p2) const { 22 return point(x - p2.x, y - p2.y); 23 } 24 point operator * (double p) const { 25 return point(x * p, y * p); 26 } 27 point operator / (double p) const { 28 return point(x / p, y / p); 29 } 30 }; 31 32 typedef point Vector; 33 typedef const point& cpoint; 34 typedef const Vector& cvector; 35 36 point operator * (double p, Vector a) { 37 return a * p; 38 } 39 40 double dot(cvector a, cvector b) { 41 return a.x * b.x + a.y * b.y; 42 } 43 44 double length(cvector a) { 45 return sqrt(dot(a,a)); 46 } 47 48 double angle(cvector a, cvector b) { 49 return acos(dot(a,b) / length(a) / length(b)); 50 } 51 52 double cross(cvector a, cvector b) { 53 return a.x * b.y - a.y * b.x; 54 } 55 56 const double PI = acos(-1.0); 57 58 int main() { 59 int t, Case = 0; 60 point a,b,c; 61 scanf("%d",&t); 62 while(t--) { 63 a.readint(); 64 b.readint(); 65 c.readint(); 66 point m = (b + c) / 2; 67 double am = length(m - a), cm = length(m - c); 68 double angO = atan(am / cm); 69 double oc = cm / sin(angO); 70 double ans = oc * 2 * angO + am; 71 printf("Case #%d: %.4f\n",++Case,ans); 72 } 73 return 0; 74 }
附上证明截图:(刚刚看懂,好强大~~ Orz Orz)