|
|
back to boardDiscussion of Problem 1312. TrayI have WA on test #5. Who can help me? (+) Here it is my code: #include <stdio.h> #include <math.h> #define eps 1e-16 struct plate { int id; double r, x, y; } p[3], pp[3], tp; double h, w, temp; double sq(double a) { return a*a;} int possible(); void output(int k); int main() { int i, j, k; scanf("%lf%lf%lf%lf%lf", &w, &h, &pp[0].r, &pp[1].r, &pp[2].r); pp[0].id = 0; pp[1].id = 1; pp[2].id = 2; for (i = 0; i < 3; ++i) for (j = 0; j < 3; ++j) for (k = 0; k < 3; ++k) if (i != j && i != k && j != k) { p[0] = pp[i]; p[1] = pp[j]; p[2] = pp[k]; if (possible()) { output(0); return 0; } } printf("0"); return 0; } //////////////////////////////////////////////////////////////// int possible() { p[0].x = p[0].r; p[0].y = p[0].r; p[1].x = w - p[1].r; p[1].y = p[1].r; if (sq(p[0].x - p[1].x) + sq(p[0].y - p[1].y) - sq(p[0].r + p[1].r) < -eps) { p[1].y = p[0].y + sqrt(sq(p[0].r + p[1].r) - sq(p[1].x - p[0].x)); if (p[1].y + p[1].r - h > eps) return 0; } p[2].x = p[2].r; p[2].y = h - p[2].r;
if (sq(p[0].x - p[2].x) + sq(p[0].y - p[2].y) - sq(p[0].r + p[2].r) < -eps) { p[2].x = p[0].x + sqrt(sq(p[0].r + p[2].r) - sq(p[2].y - p[0].y)); if (p[2].x + p[2].r - w > eps) return 0; }
if (sq(p[1].x - p[2].x) + sq(p[1].y - p[2].y) - sq(p[1].r + p[2].r) < -eps) return 0;
return 1; } void output(int k) { if (k == 1) { double t; for (k = 0; k < 3; ++k) { t = p[k].x; p[k].x = p[k].y; p[k].y = t; } } int i, j;
for (i = 0; i < 3; ++i) for (j = i+1; j < 3; ++j) if (p[i].id > p[j].id) { tp = p[i]; p[i] = p[j]; p[j] = tp; }
for (k = 0; k < 3; ++k) printf("%.4lf %.4lf ", p[k].x, p[k].y); } Re: I have WA on test #5. Who can help me? (+) It seems to me, that right solution is much more complex :(! Re: I have WA on test #5. Who can help me? (+) test 5:800 600 500 10 10 |
|
|