Gdyby ktoś nie pamiętał adresu do testowania kodu:
http://asd.spox.spoj.pl/
Najlepsze rozwiązanie to kod w C, używa najmniej pamięci i wykonuje się w 0.09 sec (wynik: 100%).
#include <stdio.h> int main() { unsigned int iloscDoWczytania; fscanf(stdin, "%u", &iloscDoWczytania); unsigned int podstawa; fscanf(stdin, "%u", &podstawa); unsigned int suma = 0; unsigned short int wczytany = 1; while(iloscDoWczytania-- > 0) { fscanf(stdin, "%hu", &wczytany); suma += wczytany; } unsigned int iloscZnakow = 1; if(podstawa == 0) { iloscZnakow = 0; } else if(podstawa == 1) { iloscZnakow = suma; } else { while(suma > podstawa) { iloscZnakow++; suma = suma / podstawa; } } fprintf(stdout, "%u", iloscZnakow); return 0; }
Inne (o dziwo – jak w kolejnych zadaniach będzie coś z tablicami to raczej PHP nie ma szans na wykonanie obliczeń w wymaganym czasie) dobre rozwiązanie to użycie PHP, wykonuje się w 0.68 sec. (wynik: 100%):
<?PHP $message = file_get_contents('php://stdin'); $d = explode(chr(0x20), $message); $iloscDoWczytania = $d[0]; $podstawa = $d[1]; $suma = 0; $idDoWczytania = 2; while($iloscDoWczytania-- > 0) { $suma += $d[$idDoWczytania++]; } $iloscZnakow = 1; if($podstawa == 0) { $iloscZnakow = 0; } else if($podstawa == 1) { $iloscZnakow = $suma; } else { while($suma > $podstawa) { $iloscZnakow++; $suma = (int) ($suma / $podstawa); } } echo $iloscZnakow;
Dla osób co liczyły na pisanie w Javie mam niestety smutną wiadomość: Java jest za wolna! Ostatni test (w którym jest podane ponad 65000 parametrów/liczb) wykonuje się ponad 2 sekundy i nie zalicza ostatniego testu (wynik: 80% [4 z 5 testów]).
import java.util.Scanner; public class Main { public static void main(String[] argumenty) { Scanner in = new Scanner(System.in); int iloscDoWczytania = in.nextInt(); int podstawa = in.nextInt(); int suma = 0; while(iloscDoWczytania-- > 0) { suma += in.nextInt(); } int iloscZnakow = 1; if(podstawa == 0) { iloscZnakow = 0; } else if(podstawa == 1) { iloscZnakow = suma; } else { while(suma > podstawa) { iloscZnakow++; suma = suma / podstawa; } } System.out.print(iloscZnakow); } }
eee, też to rozwiązywałem, w Javie, na 100% …. 🙂
To napisz jak wczytujesz dane w Javie, bo parę osób oddaje zadania w Javie na 100%, a mi samo wczytanie danych zajmuje więcej niż limit. Jak na razie najszybszy okazał się StringTokenizer, ale i tak 80% w 'Projekcie 1′.
Bo jak się używa najgorszej i katowanej na pjwstk metody na wczytywanie, to takie są efekty.
Miło by było gdyby ktoś oprócz pisania o złych metodach podał też te dobre.
Tutaj: http://www.cpe.ku.ac.th/~jim/java-io.html
znalazłem informacje jak wczytywać int’y 20-30% szybciej, niż z scanf w C (i 10-20 RAZY szybciej, niż Scanner javy).
Jednak jak opisałem w: http://skalski.at/2014/11/04/asd-spox-spoj-szybkie-wczytywanie-intow-w-c/
int’y w C można wczytać parę razy szybciej, niż przy użyciu scanf.