Why I have WA#10? I can't think test to get wrong answer. PLS help me Next my code: #include <iostream> #include <iomanip> #include <cmath> using namespace std; int main() { double a, b, c, x, y, x2, y2; double X, Y, Z, X2, Y2, Z2; double result = 0; bool bflag = true; cin >> a >> b >> c; for (int i=0; i < 2; i++) { cin >> x >> y; if (x < c) { X = 0; Y = y - b - c; Z = x; } else if (x > c + a) { X = a; Y = y - b - c; Z = 2 * c + a - x; } else { if (y <= b) { X = x - c; Y = b - y; Z = 0; } else if (y <= b + c) { X = x - c; Y = 0; Z = y - b; } else if (y <= b) { X = x - c; Y = y - b - c; Z = c; } else { X = x - c; Y = b; Z = 2 * b + 2 * c - y; } } if (bflag) { x2 = x; y2 = y; X2 = X; Y2 = Y; Z2 = Z; bflag = false; } } //cout << X << ' ' << Y << ' ' << Z << ' ' << X2 << ' ' << Y2 << ' ' << Z2; это типа отладка X2 -= X; Y2 -= Y; Z2 -= Z; result = sqrt(X2 * X2 + Y2 * Y2 + Z2 * Z2); if (result < 1.E-8) cout << fixed << setprecision(6) << 0; else cout << fixed << setprecision(6) << result; return 0; } Sorry, I'm find mistake now, it's a one wrong if in my code, thk all to find this I had WA#7 and it was passed (and problem become accepted) when I fixed the case where the Y-cord of one of points was equal to B + C. So test 7 is something like that: A B C X1 B + C X2 Y2 Good luck! Getting WA on test 25, any test case? 2 2 2 2.01 4.01 3.99 4.01 правильный ответ 1.9800000 у меня было 1.9900000 Дело в том что чтобы не париться с double я умножал сразу на 100 но оказалось что 2.01 * 100 == 200 а не 201. Пришлось вручную переводить две цифры после запятой и решение зашло! using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _1489 { class Point { public double x; public double y; public double z; static void Main(string[] args) { int A, B, C; string S = Console.ReadLine(); string[] SS = S.Split(); A = Convert.ToInt32(SS[0]); B = Convert.ToInt32(SS[1]); C = Convert.ToInt32(SS[2]); double x1, y1, x2, y2; double[] mas = Console.ReadLine().Split(' ').Select(double.Parse).ToArray(); x1 = Convert.ToDouble(mas[0]); y1 = Convert.ToDouble(mas[1]); double[] mas2 = Console.ReadLine().Split(' ').Select(double.Parse).ToArray(); x2 = Convert.ToDouble(mas2[0]); y2 = Convert.ToDouble(mas2[1]); Point a = new Point();
// A - x B - y C - z // x if (x1 <= C) a.x = 0; else if (x1 <= C + A) a.x = x1 - C; else a.x = A; // y if (y1 <= B) a.y = B - y1; else if (y1 <= B + C) a.y = 0; else if (y1 <= 2 * B + C) a.y = y1 - B - C; else a.y = B; // z if (y1 <= B) a.z = 0; else if (y1 <= B + C && x1 <= C + A && x1 >= C) a.z = y1 - B; else if (x1 <= C && y1 <= 2 * B + C) a.z = x1; else if (x1 >= C + A && y1 <= 2 * B + C) a.z = A + C + C - x1; else if (y1 >= B + C + B) a.z = 2 * (B + C) - y1; else a.z = C;
Point b = new Point();
// x if (x2 <= C) b.x = 0; else if (x2 <= C + A) b.x = x2 - C; else b.x = A; // y if (y2 <= B) b.y = B - y2; else if (y2 <= B + C) b.y = 0; else if (y2 <= 2 * B + C) b.y = y2 - B - C; else b.y = B; // z if (y2 <= B) b.z = 0; else if (y2 <= B + C && x2 <= C + A && x2 >= C) b.z = y2 - B; else if (x2 <= C && y2 <= 2 * B + C) b.z = x2; else if (x2 >= C + A && y2 <= 2 * B + C) b.z = A + C + C - x2; else if (y2 >= B + C + B) b.z = 2 * (B + C) - y2; else b.x = C;
double difx = (a.x - b.x); double dify = (a.y - b.y); double difz = (a.z - b.z); //if (difx * difx + dify * dify + difz * difz > 0) Console.WriteLine((Math.Sqrt(difx * difx + dify * dify + difz * difz))); //else Console.Write(0); } } } [code deleted] Edited by author 07.01.2010 14:37 In 5th constructor (pts[i] = new Point3D(B, C - (x[i] - A - C), y[i] - B - C);) X must be equal to A. I'm very inattentive Thank you, thank you This test helps me to pass test#4 3 3 3 4 7 4 2 Answer: 3.000000000 Lol, it helped indeed. I assigned Z twice instead of assigning Z and Y in the case of a bottom face of the figure. Edited by author 15.10.2006 11:24 Check each region by x and y, e.g. if (b+c<=y && y<=b+c+b && c <= x && x<=c+a) // bottom region I had some mistakes like If y>=a+b+c ... but must be If y>=b+b+c I have one check per one side. For example If y<=b - the point is on the lowest side (on the picture). If x<=c - the point is on the leftest side. etc. So, it is enough to check, you see, but WA#7. Thanks for help but still need it. ) You need check y > b+b+c and y < b+c.. because when point on the edge .... You can do mistake ... (I was wrong in this) I have AC, so thank U very much! But I still don't understand my mistake. It is guaranted that the point is in the picture, so I can only check one coordinate... Cann't understand... be careful when you do checks like if (x <= a) then ... it can produce WA, becouse if x = a, point can lie on another side Yes, that is true. Thank you. The test that makes the difference is: ------- 2 2 2 0 4 4 0 ------- before this correction the answer was 4.8989794856 (wrong!) but the right answer is 2.8284271247 (verifyed with AC program). This is great test. Thank you! TY, Paul Diac! Edited by author 30.10.2017 01:21 If you use real numbers, you can get situation, when point lies on none of 6 sides. So you should work with epsilon. Or you can use exact arithmetic, just multiply numbers by 100! It means 100 and !, not 100! :) Edited by author 26.06.2009 17:41 346 158 618 955.0 105.0 891.0 93.0 65.1152, isn't it????? Edited by author 21.04.2008 16:38 65.11528238 Should be 65.1153 if you print 4 digits (but the problem requires to print at least 6). I have wa8 when I used float numbers, when I changed it to double I get ac. Never use float at ACM contests :) just forget this wrong word 'float' :) right words are 'extended' 'double' :) Great thanks to you! :) Really helpful! thank you very very much!!! Please somebody help me, and give some tests, please! WA#9 is because of integer overflow My question is not particularly about this problem, but about printf output with precision 10^-6 or better. In this problem when I use float and output with printf("%.6f", ... ) I get WA8. When I use double and printf("%.6lf", ... ) I get WA1. What is the correct approach please?
I later got AC with this algorithm, it was correct as I had expected. What I did was use double for the points' coordinates and output with ".6f" as if the were float. Why does that work and my other version doesn't? Can you tell me why I am wrong in test 2 if you was wrong in test2 once? I have got WA2, because I had incorrect region checking (I used only x or y coordinate). When I used x and y I got AC. e.g. checking of bottom region is: if (b+c<=y && y<=b+c+b && c <= x && x<=c+a) Check variant, when points situated on one border!!! Olympic Bear, I had same problem and your method rocks! :D Edited by author 02.08.2012 23:28 How to control the output precision?What does "to the acuracy of 10-6? Up! Why in task 10^6, but output 10^16 Try this test: 4 3 2 8 5 2 3 Right answer is: 4.0000000 I have had WA#3, but when I have tried following test, I pass Test#3, but have WA#13: 4 3 2 2.0 0.0 2.0 10.0 Right answer: 0.0000000 Now I have AC. Edited by author 20.01.2010 13:32 [code deleted]. now i have WA 13 any tests? Edited by author 19.08.2009 04:56 Please, someboby help me and give me some tests! Can somebody say me, what is in test 10? I don't know, why i got WA... Finally I've got AC. My mistake was, I think, in printing something like "-0.*" when answer is less than epsilon. Maybe there is a special case that is not mentioned in the problem or I didn't understand... Can you give some tests? I didn't work on any of special cases. There is a good test - points that are close on the surface will be pretty close in 3D space. Otherwise you've flipped something. Also check boundary cases, especially on the edge of the envelope. Thanks I got AC... Edited by author 27.12.2007 15:33 |
|