Zadanie SPOJ - Tajemnicze zadanie

0

Witam mam taki problem z zadaniem ze SPOJ'a. Test wychodzi prawidłowy a mimo to dostaję błędną odpowiedź. Mój kod zadania (piszę w C#). Czy to rozwiązanie jest poprawne ?

 using System;

namespace Task
{
    class Program
    {
        static void Main()
        {
            double[] decodedFrequency = new double[26];
            double[] encodedFrequency = new double[26];
            int[] charsNumber = new int[26];
            string inputText = "";
            string line;
            int onlyCharsCount;
            // wczytywanie częstotliwości liter w orginalnym tekscie
            for (int i = 0; i < 26; i++)
			    decodedFrequency[i] = double.Parse(Console.ReadLine().Split(' ')[1].Replace('.',','));
            //wczytywanie wejscia (to co sedzia daje)
            while ((line=Console.ReadLine())!=null)
	            inputText+=line;
            onlyCharsCount=inputText.Length;
	        //zliczanie wszystkich liter w danym tekscie
            foreach (char c in inputText)
	        {
		        if(c > 96 && c < 123)
                    charsNumber[c-97]++;
                else if(c>64 && c<91)
                    charsNumber[c-65]++;
                else onlyCharsCount--;
	        }
            //zliczanie czestotliwosci danej litery w tekscie 
            for (int i = 0; i < 26; i++)
			{
			    encodedFrequency[i] = Math.Round(((double)charsNumber[i]/onlyCharsCount),5);
			}
            //dekodowanie 
            string decodedText = "";
            foreach (char c in inputText)
	        {
	            if(c >= 'a' && c <= 'z')
                {
                    for(int i=0;i<26;i++)   
                        if(encodedFrequency[c-97]==decodedFrequency[i])
                        {decodedText+=(char)(97+i);break;}
                }
                else if(c>='A' && c<='Z')
                {
                    for(int i=0;i<26;i++)
                        if(encodedFrequency[c-65]==decodedFrequency[i])
                        {decodedText+=(char)(65+i);break;}
                }
                else decodedText+=c;
	        }
            Console.WriteLine(decodedText);
        }
    }
}
0

Czy to rozwiązanie jest poprawne ?
Czemu sam tego nie sprawdzisz, wrzucając swoje rozwiązanie do SPOJa?

1

wywal .Replace('.',',')

1

Twój problem to porównywanie liczb zmiennoprzecinkowych. Nie masz gwarancji, że odpowiednie Math.Round(((double)charsNumber[i]/onlyCharsCount),5) wyprodukuje dokładnie tą samą wartość jaką daje ci wyczytanie wartości double.Parse(Console.ReadLine().Split(' ')[1].Replace('.',','));.

A problem z tym co podał(a) @katelx też jest, bo prasujesz używając bieżących ustawień locale, a na SPOJ będzie to raczej "US" albo "c".
Popraw to tak:

double da = double.Parse(Console.ReadLine().Split(' ')[1], CultureInfo.InvariantCulture);
0

A czy istnieje jakiś racjonalny sposób zaokrąglania tego tak jak autor podał na wejściu ?

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