SPOJ - Obżartuchy - Przekroczono Limit Czasu

0

Mam problem z tym zadaniem. W Eclipse działa mi okej - przynajmniej dane przykładowe, a na stronie wywala błąd, że przekroczono limit czasu.
Gdy klikam "run on ideone.com" to wywala tam błąd wykonania. Jakoś w ogóle nie mam pomysłu co jest nie tak ;v

Exception in thread "main" java.util.NoSuchElementException
	at java.util.Scanner.throwFor(Scanner.java:862)
	at java.util.Scanner.next(Scanner.java:1485)
	at java.util.Scanner.nextInt(Scanner.java:2117)
	at java.util.Scanner.nextInt(Scanner.java:2076)
	at Main.main(Main.java:9)
    import java.util.*;
    import java.lang.*;
     
    class Main
    {
    	public static void main (String[] args) throws java.lang.Exception
    	{
    		Scanner s = new Scanner(System.in);
    		int t = s.nextInt();
    		short n;
    		int m;
    		for (int i = 0; i < t; i++) {
    			n = s.nextShort(); // liczba obżartuchów
    			m = s.nextInt(); // liczba ciastek w opakowaniu
    			licz(n, m, s);
    		}
    		s.close();
    	}
     
    	private static void licz(short n, int m, Scanner s) {
    		int czas, iloscCiastek;
    		double sumaCiastek = 0;
    		for (int i = 0; i < n; i++) {
    			czas = s.nextInt();
    			iloscCiastek = 86400 / czas; // doba[sekundy] / czas jedzenia jednego ciastka
    			sumaCiastek += iloscCiastek;
    		}
    		System.out.println((int) Math.ceil(sumaCiastek / m));
    	}
    }
1

Na IDEone musisz podać input ;]
Popatrz na limitu na spoju. Masz 1.5GB ramu ale tylko 0.146s czasu, to powinno zasugerować trochę sprytniejsze podejście do problemu. Wyobraź sobie że wysłałem ci 10 000 identycznych czasów. Ty i tak liczysz dla każdego z nich osobno identyczne dzielenie i dodajesz identyczną wartość. Może da się to zrobić lepiej? :)

0

Coś takiego udało mi się wymyślić, po tym co napisałeś ale też przekroczyłem czas :v Jutro na świeżo popatrzę na to, bo dzisiaj jestem już zmęczony i nie myślę.

private static void licz(int n, int m, Scanner s) {
		int[] czas = new int[n];
		int powtarzanie = 1;
		int iloscCiastek;
		double sumaCiastek = 0;
		for (int i = 0; i < n; i++)
			czas[i] = s.nextInt();
		Arrays.sort(czas);
		iloscCiastek = 86400 / czas[0];
		sumaCiastek += iloscCiastek;
		for (int i = 1; i < n; i++) {
			if (czas[i - 1] == czas[i]) {
				while (czas[i - 1] == czas[i] && i < (czas.length - 1)) {
					powtarzanie++;
					i++;
				}
				iloscCiastek *= powtarzanie;
				powtarzanie = 0;
			} else {
				iloscCiastek = 86400 / czas[i];
			}
			sumaCiastek += iloscCiastek;
		}
		System.out.println((int) Math.ceil(sumaCiastek / m));
	}
1

Problemem jest zbyt wolne wczytywanie danych przez Scanner. Dostałem AC (czas 0.11 - 0.12s) używając BufferedReadera jak poniżej.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
...
int t = Integer.parseInt(br.readLine());
...
String line = br.readLine();
String[] tab = line.split(" ");
n = Integer.parseInt(tab[0]);
m = Integer.parseInt(tab[1]);
...
licz(n, m, s, br);
...
czas = Integer.parseInt(br.readLine());

0

Dziękuję ślicznie. Zaliczyło mi z czasem 0.10 po zmianie Scannera na BufferedReadera.
Swoją drogą jaka jest różnica pomiędzy Scannerem, a BufferedReaderem - na zajęciach używamy tylko BufferedReadera, za to w internetowych tutorialach praktycznie wszędzie występuje Scanner. Szukałem kiedyś o tym czym się różnią ale średnio udało mi się cokolwiek zrozumieć, więc byłbym wdzięczny gdyby ktoś spróbował mi wyjaśnić to w kilku prostych słowach.
I jeszcze pytanie, co to za niebieski trójkącik

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