Wątek przeniesiony 2020-11-04 22:11 z Algorytmy i struktury danych przez furious programming.

KC004 - Zliczanie wystąpień

0

serwus, mam problem z tym zadaniem https://pl.spoj.com/problems/KC004/

poniższy kod działa (a tak przynajmniej mi się wydaje) i zdaję sobie sprawę, że nie jest to kawałek ładnego kodu, ale przejdźmy do rzeczy: na jednym zestawie danych wypluwa wynik pozytywny, jednak nie wiem jak zrobić w C# a wejście programu podana zostanie pewna nieokreślona liczba zestawów danych. Ewentualnie byłbym wdzięczny za wskazówki, jak Ty rozwiązałbyś to zadanie :)

    class Program
    {
        static void Main(string[] args)
        {
            ArrayList lista = new ArrayList();
 
            int wynik = 0;
 
            string tekst = Console.ReadLine();
            string[] split = tekst.Split(' ');
 
            int poszukiwana = int.Parse(split[0]);
            int ileLiczb = int.Parse(split[1]);
 
            for (int j = 0; j < ileLiczb; j++)
            {
                int liczba = int.Parse(split[j + 2]);
                lista.Add(liczba);
            }
 
            foreach (int liczba in lista)
            {
                if (liczba == poszukiwana)
                {
                    wynik++;
                }
            }
            Console.WriteLine(wynik);
            Console.ReadKey();
        }
    }

https://pastebin.com/63djKBBQ

1

Może w pętli while?

while (true)
        {
            string line = Console.ReadLine();
            // TODO
            if (line == "") 
            {
                break;
            }
        }
0

lion137, o dlaczego sam na to nie wpadłem? super! zmodyfikowałem go troszkę i wrzuciłem w moje zadanie. U mnie działa wszystko jak należy, niestety SPOJ wyrzuca błąd - NZEC (non-zero exit code) - program zwrócił kod błedu, różny od zera. No nic, zastanowię się trochę i może uda mi się go rozwiązać. Dzięki za pomoc! :)

while (true)
        {
            ArrayList lista = new ArrayList();
            int wynik = 0;

            string tekst = Console.ReadLine();

            if (tekst == "")
            {
                break;
            }

            string[] split = tekst.Split(' ');
            int a = int.Parse(split[0]);
            int b = int.Parse(split[1]);

            for (int j = 0; j < b; j++)
            {
                int liczba = int.Parse(split[j + 2]);
                lista.Add(liczba);
            }

            foreach (int liczba in lista)
            {
                if (liczba == a)
                {
                    wynik++;
                }
            }

            Console.WriteLine(wynik);
        }
1

Nie rozumiem po co parsujesz te elementy. Przy okazji zobacz, jaki krótki robi się ten "algorytm", jeśli użyje się linq.

            while (true)
            {
                var line = Console.ReadLine();
                if (string.IsNullOrEmpty(line))
                    break;
                var data = line.Split(' ');
                var searchPhrase = data[0];
                var dataLength = int.Parse(data[1]);
                var result = data.Skip(2).Take(dataLength).Count(e => e == searchPhrase);

                Console.WriteLine(result.ToString());
            }
0

@ŁF: wygląda dużo lepiej, a przede wszystkim działa. Ale nie wiem co się dzieje w 9 linijce :P

1
data // tablica wszystkich elementów
    .Skip(2) // pomiń pierwsze dwa (pierwszy to puszukiwany element, drugi to ilość elementów, które trzeba przeszukać)
    .Take(dataLength) // puść dalej tyle elementów, ile zdefiniowanych w zmiennej dataLength (krok w zasadzie do pominięcia, bo nie sądzę, żeby w testach dali za dużo danych)
    .Count(e => e == searchPhrase) // zwróć ilość elementów spełniających warunek z argumentu, czyli równych co do wartości zmiennej searchPhrase

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