Zadanie ze SPOJ'a - czy metoda rozwiązania jest prawidłowa?

0

Dzień dobry,
próbuję rozwiązać zadanie ze SPOJ'a => http://pl.spoj.com/problems/HILLS2/ lecz sędzia nie akceptuje mi wyniku. W związku z tym chciałbym wiedzieć, gdzie popełniam błąd. Jeżeli mógłbym prosić o pomoc w znalezieniu go to proszę. Niżej wklejam kod, jeszcze jedna istotna sprawa : Czy sposób rozwiązania ( sama metoda ) jest dobra ?
Pozdrawiam

 using System;

namespace ConsoleApplication1
{
    class Program
    {
        static double ToAngleMultiply = 2*Math.PI / 360;
        static double angle = 0;
        static double x = 0, y = 0;
        static void Main(string[] args)
        {
            int t = int.Parse(Console.ReadLine());
            for (int i = 0; i < t; i++)
            {
                int k1 = int.Parse(Console.ReadLine());
                string s;
                for(int j=0;j<k1;j++)
                {
                    s = Console.ReadLine();
                    switch (s.Split(' ')[0])
                    {
                        case "MOVE":
                            x += Math.Sin(ToAngleMultiply * angle) * double.Parse(s.Split(' ')[1]);
                            y += Math.Cos(ToAngleMultiply * angle) * double.Parse(s.Split(' ')[1]);
                            break;
                        case "TURN":
                            angle += double.Parse(s.Split(' ')[1]);
                            break;
                        case "PREPARE":
                            { x = 0; y = 0; angle = 0; }
                            break;

                    }
                }
                string answer =Convert.ToString(Math.Abs((double)Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2))));
                if (answer.Split(',').Length == 1)
                    answer += ".00";
                else if (answer.Split(',')[1].Length == 1)
                    answer += "0";
                else if (answer.Split(',')[1].Length > 2)
                    answer = answer.Split(',')[0] + ","+answer.Split(',')[1][0] + answer.Split(',')[1][1]; 
                Console.WriteLine(answer.Replace(',','.'));
            }
           
        }
    }
}

0

twoj kod daje bledne wyniki nawet dla przykladu testowego.
algorytm na oko wyglada ok, ale watpie zeby przeszlo limity czasowe, jesli input bedzie tak duzy jak w opisie zadania to operacje na stringach beda trwaly wiecznosc

0

Tutaj trochę poprawiłem:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static double ToAngleMultiply = 2 * Math.PI / 360;
        static double angle = 0;
        static double x = 0, y = 0;
        static void Main(string[] args)
        {
            int t = int.Parse(Console.ReadLine());
            double m = 0;
            for (int i = 0; i < t; i++)
            {
                int k1 = int.Parse(Console.ReadLine());
                string[] s;
                for (int j = 0; j < k1; j++)
                {
                    s = Console.ReadLine().Split(' ');
                    switch (s[0])
                    {
                        case "MOVE":
                            m = double.Parse(s[1]);
                            x += Math.Sin(ToAngleMultiply * angle) * m;
                            y += Math.Cos(ToAngleMultiply * angle) * m;
                            break;
                        case "TURN":
                            angle += double.Parse(s[1]);
                            break;
                        case "PREPARE":
                            { x = 0; y = 0; angle = 0; }
                            break;

                    }
                }
                string[] answer = (Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2))).ToString().Split(',');
                if(answer.Length==1)
                    Console.WriteLine(answer[0]+".00");
                else if(answer[1].Length>2)
                        Console.WriteLine(answer[0]+"."+answer[1][0]+answer[1][1]);
                else if(answer[1].Length==2)
                    Console.WriteLine(answer[0]+"."+answer[1]);
                else Console.WriteLine(answer[0]+"."+answer[1][0]+"0");
            }

        }
    }
} 

Lecz sędzia dalej nie akceptuje ( błędna odpowiedź ). Czy myślą Państwo, iż problem leży w sposobie czy raczej niedokładności stałych i typu double ?
Pozdrawiam

0

Algorytm sam w sobie jest dobry. Jedynie błędne jest wyświetlanie wyniku z dokładnością do 2 miejsc po przecinku.

0

Ja w ogóle nie rozumiem co to za WTF z tym przecinkiem robisz. Przeciez normalnie możesz wypisać floata z odpowiednią dokładnością o_O

0

Ale czy jest możliwość aby zrobić taki myk ?

3 => 3.00 
3.2 => 3.20
0.9 => 0.90 

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1