1 / 12
Dec 2015

Cześć, mam problem z tym że mój program w C# działa bardzo długo i nie wiem dlaczego, sędzia nie chce przyjąć ponieważ przekraczam limit czasu i jem bardzo dużo pamięci

mój kod:

using System;

public class Test
{
public static void Main()
{
int n = int.Parse(Console.ReadLine());
if (n < 3 && n > 0) Console.WriteLine("NIE");
if (n == 0) { Console.Write("{0}", n); }
if (n == 3)
{
int a = 1, b = 3, c = 0, d = 2;

        Console.Write("{0} ", a);
        Console.Write("{0} ", b);
        Console.Write("{0} ", c);
        Console.Write("{0} ", d);
    }
    if (n > 3)
    {
        for (int i = 0; i <= n; i = i + 2)
        {
            Console.Write("{0} ", i);
        }
        for (int i = 1; i <= n; i = i + 2)
        {
            Console.Write("{0} ", i);
        }
    }

}

}

  • created

    Dec '15
  • last reply

    Apr '23
  • 11

    replies

  • 1.8k

    views

  • 10

    users

  • 3

    likes

  • 3

    links

Podobny algorytm przeszedł mi w Pythonie bez problemu, widocznie Console.Write() jest zbyt wolne do tego zadnia. Musisz poszukać czegoś innego, dodatkowo możesz np zamiast od razu wypisywać dodawać te liczby i spacje do jakiegoś stringa i dopiero na koniec go wypisać

1 year later

Widzę, że dalej masz niezaliczone to zadanie. Poza tym może komuś ten wpis pomoże. U mnie faktycznie metoda Console.Write() powodowała przekroczenie limitu czasu. Zapisy do stringa i wypisywanie go na końcu pętli również okazały się za wolne. Pomogła klasa StringBuilder. Jest wystarczająco szybka aby zmieścić się w limicie czasowym zadania. Ot takie uroki C#

12 days later

Czesc,

tez mam problem z czasem wykonania zadania w javie. Już wcześniej wpadłem na pomysł użycia StringBuildera i StringBuffera niestety efekt jest ciągle ten sam...

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
  
    int number = Integer.parseInt(in.next());
    StringBuffer output = new StringBuffer();

    if (number == 0) {
        System.out.println("0");
    } else if (number <= 2) {
        System.out.println("NIE");
    } else if (number == 3) {
        System.out.println("2 0 3 1");
    } else {
        for (int i = 0; i <= number; i += 2) {
            output.append(i + " ");
        }
        for (int i = 1; i <= number; i += 2) {
            if (i == number || i == (number - 1)) {
                output.append(i);
            } else
                output.append(i + " ");
        }
    }
    System.out.println(output);
}

czy ktoś może podpowiedzieć jak to rozwiązać? Jak przyspieszyć wykonanie kodu?

1 month later
  1. Używasz StringBuffer ale nie alokujesz na starcie odpowiedniej ilości pamięci.
  2. Do rozwiązania tego zadania wystarczy 1 pętla
3 years later

Cześć,

Kontynuuje wątek tutaj, ponieważ nie ma osobnego wątku dla PYTHON.
Dostaje błędną odpowiedź, nie mam pojęcia dlaczego.

Blisko. Pytanie: czy jesteś pewien, że dla wszystkich liczb z zakresu 0, 1, 2 i 3 masz prawidłową odpowiedź? Bo na moje oko tylko dla dwóch z nich :wink:

Hej,

Dzięki serdeczne za bardzo rzeczowe naprowadzenie na błąd.
Założyłem, że 0 nie może być bo nie ma sąsiedniej liczby, a na 3 przeniosłem rozwiązanie jak dla wyższych liczb i zapomniałem, że mogą być do dowolnej kolejności.
Jeszcze raz dzięki.

2 years later

Witajcie!

Czy ktoś może mi podpowiedzieć jak można zmodyfikować ten kod?
W VScode przechodzi przy n=10^6, natomiast IDEOne wywala błąd. Z kolei sędzia zgłasza przekroczenie czasu…

https://ideone.com/cntlfI5

Dzięki za pomoc!

IDEONE ma ograniczenie dla bufora wyjsciowego co do ilosci znakow. Przez to wywala blad.
Jaki masz czas dla 10^6 na Twojej maszynie?

Wychodzi różnie od 0,685 - 0,71 sek. Wiem, że limit jest mniejszy (0,1 s), ale nie bardzo wiem co można zmienić.