Eine Geschichte, die ich mit Java nur schwer herausfordern konnte

Eine Geschichte, die ich mit Java nur schwer herausfordern konnte

Java x Wettbewerbsprogrammierung

Ich denke, der Engpass bei der Teilnahme an wettbewerbsfähiger Programmierung in Java ist die Begrenzung der Ausführungszeit. In einigen Fällen dauert die Plattform, an der ich teilnehme, 20 bis 20 Mal länger als C ++ 14 und 4 Mal länger als Python 3 (Java 8 Open JDK 1.8.0).

Obwohl ich die Logik zur Lösung des Problems entwickelt habe, habe ich oft das Gefühl, dass ich es nicht beenden kann, da die Antwort aufgrund der begrenzten Ausführungszeit nicht korrekt ist.

Daher möchte ich den Inhalt der schwierigen Probleme, auf die ich kürzlich gestoßen bin, sowie die Maßnahmen und Richtlinien für solche Probleme mitteilen. Es ist eine Notiz eines Anfänger-Programmierers (nicht bescheiden), also zögern Sie nicht, einen Kommentar abzugeben.

Finden Sie den Median

  • Bei den Eingaben von 2 oder mehr geraden A-Werten und 1 oder mehr natürlichen A-Zahlen die Mitte der Menge für eine ungerade Anzahl von Zahlen, wobei jeweils eine A-Ganzzahl in der Reihenfolge der Eingabe ausgeschlossen ist. Geben Sie die Werte der Reihe nach aus. * *
  • Allerdings ・ Es ist garantiert, dass A immer 10 ^ 5 oder weniger ist. -Es wird garantiert, dass alle Eingaben Ganzzahlen sind. * *
  • Verarbeitungsbeispiel: * input *6 (==A) 7 1 4 2 6 9 (Eingabe von 1 oder mehr angegebenen natürlichen Zahlen (als Testfall angegeben)) *

output

Klicken Sie hier für eine Beschreibung des Medians https://ja.wikipedia.org/wiki/%E4%B8%AD%E5%A4%AE%E5%80%A4

Wie löst man

Aus dem Inhalt des Problems

** - Speichern Sie den eingegebenen Wert in einem numerischen Array (in Array oder ArrayList). ** ** ** ** - Löschen Sie die Elemente in der angegebenen Reihenfolge aus diesem Array. ** ** ** ** - Sortieren Sie das Array. ** ** ** ** ・ (A / 2) - Den ersten Wert ausgeben. ** ** **

Sie können den Ablauf der Verarbeitung sehen. Das bedeutet

-Löschen Sie die Elemente in der Reihenfolge von diesem Array. -Sortieren Sie das Array. ・ (A / 2) - Geben Sie den ersten Wert aus. Sie müssen nur den iterativen Prozess schreiben.

Hier ist der Code, den ich zuerst geschrieben habe.

Main.java


  import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Scanner;
     
    public class Main {
    	public static void main(String[] args) {
    		Scanner s = new Scanner(System.in);
    		int n = s.nextInt();
    		ArrayList<Integer> arr = new ArrayList<>();
     
    		for (int i = 0; i < n; i++) {
    			arr.add(s.nextInt());
    		}
    		ArrayList<Integer> arrCopy = (ArrayList<Integer>) arr.clone();
     
    		for(int j=0;j<n;j++){
    	/*★*/		arr.remove(j);
    	/*★*/		Collections.sort(arr);
    			   System.out.println(arr.get((n / 2) - 1));
    	/*★*/		arr = (ArrayList<Integer>) arrCopy.clone();
    		}
    	}
    }

Dieser Code überschreitet jedoch die Ausführungszeit in der Produktionsumgebung. Aus, weil die Liste an der Position ★ für A-mal gelöscht, sortiert und dupliziert wird. Die ArrayList-Klasse hat eine variable Anzahl von Elementen, hat jedoch die Eigenschaft, dass sie tendenziell langsamer als die Array-Klasse ausgeführt wird.

So halten Sie zeitliche Einschränkungen ein

Übrigens bestand der Inhalt der Aufgabe darin, jeweils den Medianwert auszugeben. Sie müssen die Elemente einzeln löschen und den Medianwert angeben, aber Sie sollten ArrayList nicht verwenden. …

Tatsächlich gibt es für den Medianwert dieses Problems ** unabhängig von der Anzahl der Elemente zwei Kandidaten **.

Zum Beispiel

1,2,3,4,5,6

Selbst wenn Sie die Zahlen nacheinander von 1 bis 6 löschen, ist der Medianwert bei der gegebenen Zahl immer entweder ** 3 ** oder ** 4 **.

Wenn 1,2,3 gelöscht werden, ist 4 der Medianwert, Wenn 4,5,6 gelöscht wird, wird 3 als Medianwert bestimmt.

Hier ist der Code, den ich geschrieben habe, nachdem ich dies berücksichtigt habe.

Main.java


    import java.util.Arrays;
    import java.util.Scanner;
     
    public class Main {
    	public static void main(String[] args) {
     
    		Scanner s = new Scanner(System.in);
    		int n = s.nextInt();
    		int[] sortedArr = new int[n];
     
    		for (int i = 0; i < n; i++) {
    			sortedArr[i] = s.nextInt();
    		}
     
    		int[]originArr=sortedArr.clone();
    		Arrays.sort(sortedArr);
     
    		int firstNum=sortedArr[(n/2)-1];
    		int secondNum=sortedArr[n/2];
     
    		for(int j=0;j<n;j++){
    			if(originArr[j]<secondNum){
    				System.out.	println(secondNum);
    			}
    			else{
    				System.out.println(firstNum);
    			}
    		}
     
    	}
    }

Dies ist bis zu dem Punkt gleich, an dem die eingegebenen Nummern im Array gespeichert werden (obwohl die Array-Klasse unterschiedlich ist). Danach speichert (n / 2) die 1. und n / 2. Zahl als int-Werte. Dann vergleicht es die gelöschte Zahl mit der kleinen Anzahl von Median-Kandidaten und gibt einen beliebigen Wert aus.

In diesem Code müssen Sie das Array in der Ausgabe für Anweisung nicht bearbeiten. Und selbst in Java können Sie die Zeitbeschränkung beibehalten, auch wenn die Elemente des Arrays variabel sind.

Wie man die zeitlichen Einschränkungen angeht

Zunächst einmal ist es falsch anzunehmen, dass sich der Medianwert in jedem gelöschten Array dynamisch ändert. Der Faktor, der eine solche Prämisse gemacht hat, ist die Ungeduld, dass "ich den Code schnell schreiben und einreichen muss".

Ich denke, die Wettbewerbsprogrammierung ist eine spezielle Umgebung für Programmierer, und für die meisten Teilnehmer muss ich Code schreiben, der in schwierigen Wettbewerbszeiten funktioniert. Mit anderen Worten, es ist leicht, ungeduldig zu werden, weil Sie schnell Code schreiben möchten.

Für diejenigen, die bis zu einem gewissen Grad daran gewöhnt sind (diejenigen, die andere Fragen beantworten können als diejenigen, die nur wenige Prozent der Gesamtzahl beantworten können), ist die erforderliche Zeit ein wichtigerer Faktor für die Bestimmung des Teilnehmerrankings als die Anzahl der richtigen Antworten auf die Frage. Insbesondere.

In einer eingeschränkten Umgebung und bei Teilnahme an wettbewerbsfähigen Programmen wie Java in einer "nachteiligen" Sprache ・ Schreiben Sie mehrere Prozesse in einen sich wiederholenden Satz. ・ Verwenden Sie bequeme Klassen

eher, als, ・ Untersuchen Sie die Regeln für Antworten ・ Auch wenn wiederholte Anweisungen verwendet werden, wird die Verarbeitung in ihnen minimiert.

Das ist eine wichtige Strategie, die mir auch ein Gebot ist, und ich wollte sie diesmal teilen.

Das ist alles. Wenn Sie Fehler oder andere Lösungen haben, teilen Sie uns dies bitte in den Kommentaren mit.

Recommended Posts

Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
Ich habe versucht, den Block mit Java zu brechen (1)
Eine Geschichte, die ich mit der Stream-API von Java8 einem Prozess schreiben wollte, der einer while-Anweisung entspricht
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Wagen Sie es, Kaggle mit Java herauszufordern (1)
Ich habe versucht, mit Java zu interagieren
Ich möchte eine Schleife schreiben, die auf einen Index mit der Stream-API von Java 8 verweist
Eine Geschichte, die mit der Einführung von Web Apple Pay zu kämpfen hatte
Eine Geschichte, die ich als Nicht-Ingenieur endlich verstanden habe
Java: Eine Geschichte, in der ich mich unwohl fühlte, als mir beigebracht wurde, Strings ohne Grund mit Gleichen zu vergleichen.
Wie gehe ich mit dem Typ um, den ich 2 Jahre lang über das Schreiben eines Java-Programms nachgedacht habe?
Eine eigenständige Java-App, die Protokolle mit slf4j / logback an CloudWatch-Protokolle sendet
Ich habe versucht, Java mit einer Reihe zu lernen, die Anfänger klar verstehen können
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
Ich habe versucht, eine Web-API zu erstellen, die mit Quarkus eine Verbindung zur Datenbank herstellt
Ich möchte mit Jakarta EE 8 mit Java 11 ein dunkles Web-SNS erstellen
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
Herausforderung, mit verstümmelten Zeichen mit Java AudioSystem.getMixerInfo () umzugehen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Eine Geschichte, die Zeit brauchte, um eine Verbindung herzustellen
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Ich möchte Java8 für jeden mit Index verwenden
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Die Geschichte des Versuchs, JAVA File zu bedienen
[Kotlin] Ich wollte ein PNG mit einer großen Kapazität pro Bereich generieren [Java]
Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
[Java] Ich habe versucht, über den Verbindungspool eine Verbindung mit Servlet (Tomcat) & MySQL & Java herzustellen
[Kleine Geschichte] Ich habe versucht, die Java-ArrayList etwas komfortabler zu gestalten
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 (Black Magic) ausgeben.
Eine Geschichte, die mir sehr gut gefallen hat, als ich mit Ruby Triple DES gemacht habe
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht
Ich habe versucht, mit Java und Spring eine Funktion / einen Bildschirm für den Administrator einer Einkaufsseite zu erstellen
Senden Sie einen Job an AWS Batch mit Java (Eclipse)
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
Beachten Sie, dass ich süchtig nach Stapelverarbeitung mit Spring Boot war
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (graue Magie, die weniger schwarze Magie ist)
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich möchte eine bestimmte Datei mit WatchService überwachen
Eine Geschichte über den Versuch, mit Mockito auszukommen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, mit OCR eine PDF-Datei mit Java zu verarbeiten
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
Die Geschichte, Sprint-Boot mit Kubernetes (GKE) auszuführen und keine Verbindung zu CloudSQL herzustellen
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Eine Geschichte über die Reduzierung des Speicherverbrauchs auf 1/100 mit find_in_batches
Ich habe einen Wrapper erstellt, der KNP von Java aus aufruft
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Royal Road Edition, die weder Magie noch irgendetwas ist)
Eine Geschichte über die Entwicklung von ROS namens Rosjava mit Java
[Azure] Ich habe versucht, eine kostenlose Java-App zu erstellen ~ Mit FTP verbinden ~ [Anfänger]
Ich habe nc (netcat) normalerweise mit JAVA gemacht
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde