Ich habe versucht, die letzten 10 Fragen zu lösen, die nach der Registrierung bei AtCoder in Java gelöst werden sollten

Einführung

Was tun als nächstes nach der Registrierung bei AtCoder? Wenn Sie so viel lösen, können Sie genug kämpfen! Ich habe versucht, das in den letzten 10 ausgewählten Fragen ~ mit Java eingeführte Problem zu lösen.

Im obigen Artikel wird die Lösungsmethode in C ++ geschrieben und der Artikel, den ich in anderen Sprachen zu lösen versucht habe, wird vorgestellt. Daher werde ich hier versuchen, so viele Java-spezifische Methoden wie möglich zu verwenden. Java ist jedoch eine C ++ - basierte Sprache, sodass eine ähnliche Implementierung in C ++ möglich ist ...

Frage 1: ABC 086 A - Produkt

Es ist eine Frage der Gleichmäßigkeit des Produkts zweier ganzer Zahlen. Es ist ein Grundproblem.

In Java wird beim Empfang von Eingaben "System.in" an "Scanner" übergeben und verwendet. Verwenden Sie je nach Art der empfangenen Daten auch verschiedene Methoden.

Dieses Mal haben wir es mit ganzen Zahlen zu tun, also verwenden wir "nextInt ()".

Nebenbei bemerkt, wenn es um Ganzzahlen geht, ist "Integer.parseInt (sc.next ())" schneller als "nextInt ()", oder "Scanner" ist in erster Linie langsam, also Leute, die ihre eigene Scannermethode verwenden. Es scheint zu geben. Wenn Sie interessiert sind, versuchen Sie es bitte mit Google.

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        if ((a * b) % 2 == 0)
            System.out.println("Even");
        else
            System.out.println("Odd");
    }
}

Frage 2: ABC 081 A - Platzieren von Murmeln

Es ist ein Problem, "1" in der angegebenen dreistelligen Zahl zu zählen.

Es ist ein Problem beim Umgang mit Zahlen, aber da es leicht zu lösen ist, wenn es als Zeichenfolge behandelt wird, verwenden Sie next (). Es ist eine Zeichenfolge, die nur aus "0" und "1" besteht. Wenn Sie also die Länge der restlichen Zeichenfolge ohne "0" nachschlagen, ist dies die Antwort. Ersetzen wir "0" durch "" durch "replaceAll ()".

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        s = s.replaceAll("0", "");
        System.out.println(s.length());
    }
}

Frage 3: ABC 081 B - Nur Schicht

Das Problem ist, wie oft Sie mehrere Ganzzahlen gleichzeitig durch 2 teilen können, bis eine davon nicht teilbar ist.

Die Tatsache, dass eine Zahl durch 2 teilbar ist, entspricht der Tatsache, dass die Einerstelle 0 ist, wenn sie binär ausgedrückt wird. Mit anderen Worten, wie oft eine Zahl durch 2 teilbar ist, kann durch Untersuchen der Anzahl von Nullen ermittelt werden, die von unten fortgesetzt wird. Sie können dies für alle Zahlen oder Werte tun, um die Antwort für die kleinste Zahl zu finden, die durch zwei geteilt werden kann. Die Anzahl der Nullen finden Sie unten mit "Integer.numberOfTrailingZeros ()".

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int bit = 0;
        for (int i=0; i<N; i++) {
            bit |= sc.nextInt();
        }
        System.out.println(Integer.numberOfTrailingZeros(bit));
    }
}

Frage 4: ABC 087 B - Münzen

Es ist eine Frage, wie viele Möglichkeiten es gibt, einen bestimmten Betrag mit 500-Yen-Bällen, 100-Yen-Bällen und 50-Yen-Bällen zu bezahlen.

Die Anzahl der 500-Yen-Bälle und die Anzahl der 100-Yen-Bälle werden durch die for-Anweisung bestimmt, und die Anzahl der 50-Yen-Bälle wird durch die Differenz von X berechnet. Da die Bedingung des Problems besagt, dass X ein Vielfaches von 50 ist, besteht keine Notwendigkeit, den Fall zu berücksichtigen, in dem die Anzahl von 50-Yen-Bällen ein Bruchteil wird.

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int A = sc.nextInt();
        int B = sc.nextInt();
        int C = sc.nextInt();
        int X = sc.nextInt();

        int res = 0;
        for (int a=0; a<=A; a++) {
            for (int b=0; b<=B; b++) {
                int c = (X - a * 500 - b * 100) / 50;
                if (c >= 0 && c <= C)
                    res++;
            }
        }

        System.out.println(res);
    }
}

Frage 5: ABC 083 B - Einige Summen

Für Zahlen kleiner oder gleich N besteht das Problem darin, die Summe der Zahlen zu finden, deren Summe jeder Ziffer A oder mehr und B oder weniger ist.

Hier werden wir gehorsam die Summe jeder Ziffer für jeden Wert zwischen 1 und N untersuchen. Es ist die while-Anweisung, die die Summe jeder Ziffer berechnet. n% 10 addiert den niedrigstwertigen Wert zu digSum und n / = 10 verwirft die niedrigstwertige Ziffer. Ich mag keine Dezimalzahlen, weil sie umständlicher zu handhaben sind als Binärzahlen ...

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int A = sc.nextInt();
        int B = sc.nextInt();

        int sum = 0;
        for (int i=1; i<=N; i++) {
            int n = i;
            int digSum = 0;
            while (n > 0) {
                digSum += n % 10;
                n /= 10;
            }
            if (digSum >= A && digSum <= B)
                sum += i;
        }
        System.out.println(sum);
    }
}

Frage 6: ABC 088 B - Kartenspiel für zwei

Stellen Sie sich ein Spiel vor, in dem mehrere Karten mit Zahlen geschrieben sind und zwei Personen sie abwechselnd nehmen und um die Gesamtsumme kämpfen. Zu diesem Zeitpunkt besteht das Problem darin, herauszufinden, wie viele Zahlen der erste Spieler als der zweite Spieler annehmen kann.

Um die Karten zu erhalten, die die Punkte des anderen maximieren, nehmen wir die Karte mit der größten Anzahl von Karten im Spiel. Mit anderen Worten, die Karten werden in absteigender Reihenfolge sortiert und die Karten werden von Anfang an abwechselnd genommen.

Verwenden Sie Arrays.sort (), um die Arrays zu sortieren. Auch dieses Mal möchten wir in absteigender Reihenfolge sortieren, also übergeben Sie "Comparator.reverseOrder ()" als zweites Argument. Übrigens, wenn Sie "Liste" sortieren möchten, verwenden Sie "Collections.sort ()". Java verwendet "List" häufiger als Arrays, daher ist es möglicherweise wahrscheinlicher, dass Sie es verwenden.

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        Integer a[] = new Integer[N];
        for (int i=0; i<N; i++) {
            a[i] = sc.nextInt();
        }
        Arrays.sort(a, Comparator.reverseOrder());

        int Alice = 0;
        int Bob   = 0;
        for (int i=0; i<N; i+=2) {
            Alice += a[i];
        }
        for (int i=1; i<N; i+=2) {
            Bob += a[i];
        }
        System.out.println(Alice - Bob);
    }
}

Frage 7: ABC 085 B - Kagami Mochi

Wenn es mehrere Reiskuchen unterschiedlicher Größe gibt, ist es eine Frage, wie viele Stufen von Spiegelreiskuchen nur mit Reiskuchen unterschiedlicher Größe hergestellt werden können.

Set ist nützlich bei Problemen mit nicht doppelten Zahlen. Set kann eine beliebige Anzahl von Objekten wie List speichern, Duplikate werden jedoch ignoriert. Sie können die Antwort leicht finden, indem Sie alle Reiskuchengrößen zu "Set" hinzufügen und schließlich die Anzahl der Daten zählen, die "Set" enthält.

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        Set<Integer> num = new HashSet<>();
        for (int i=0; i<N; i++) {
            int di = sc.nextInt();
            num.add(di);
        }
        System.out.println(num.size());
    }
}

Frage 8: ABC 085 C - Otoshidama

Es gibt 10000-Yen-Scheine, 5000-Yen-Scheine und 1000-Yen-Scheine, und das Problem besteht darin, eine Kombination zu finden, die die Summe aus N- und Y-Yen ergibt.

Es ist ein ähnliches Problem wie bei Frage 4. Die Lösungsmethode ist ähnlich, z. B. die Verwendung einer double for-Anweisung.

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int Y = sc.nextInt();

        for (int a=0; a<=N; a++) {
            for (int b=0; b<=N-a; b++) {
                int c = N - a - b;
                int total = a * 10000 + b * 5000 + c * 1000;
                if (total == Y) {
                    System.out.println(a + " " + b + " " + c);
                    return;
                }
            }
        }

        System.out.println("-1 -1 -1");
    }
}

Frage 9: ABC 049 C - Daydream

Es ist ein Problem zu beurteilen, ob eine bestimmte Zeichenkette durch Verketten einer Kombination aus "Traum", "Träumer", "Löschen" und "Radiergummi" erstellt werden kann.

Wenn Sie die Zeichenfolge von Anfang an anwenden, stimmt der Anfang von "Träumerase" mit "Träumer" überein, oder der Anfang von "Träumerase" stimmt mit "Traum" überein. Überprüfen Sie dies daher von hinten. Von hinten treten solche Fehler nicht auf.

Verwenden Sie endsWith (), um herauszufinden, ob eine Zeichenfolge mit dem Ende einer anderen übereinstimmt. Natürlich gibt es auch startWith (), das prüft, ob eine Zeichenfolge mit dem Anfang einer anderen übereinstimmt.

import java.util.*;

class Main {
    static String[] strs = {
        "dream",
        "dreamer",
        "erase",
        "eraser"
    };

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String S = sc.next();

        while (true) {
            boolean endsWithStr = false;
            for (String str: strs) {
                if (S.endsWith(str)) {
                    endsWithStr = true;
                    S = S.substring(0, S.length() - str.length());
                    break;
                }
            }
            if (!endsWithStr) {
                System.out.println("NO");
                break;
            }
            if (S.length() <= 0) {
                System.out.println("YES");
                break;
            }
        }
    }
}

Ich habe versucht, es zu schreiben, aber tatsächlich kann ich es in dieser Antwort nicht mit AtCoder weitergeben. Es ist MLE ... Anscheinend ist die Ursache zu viel String-Generierung. Ich habe einige Verbesserungen vorgenommen und dafür gesorgt, dass der Code nicht "EndsWith ()" verwendet, und es ist bestanden, aber es ist nicht interessant, es zu setzen, also werde ich eine andere Lösung setzen.


Ersetzen Sie einfach jede Zeichenfolge und löschen Sie sie. Legen Sie bei dieser Methode die Reihenfolge der zu löschenden Zeichenfolgen fest, damit kein versehentliches Löschen erfolgt. Lösche den Träumer vor dem Traum, den Radiergummi vor dem Löschen, den Löscher und den Radiergummi vor dem Träumer.

[Zusatz] Mit dieser Methode werden Sie fälschlicherweise denken, dass eine Zeichenkette wie "Dreameraseer" aus Löschen und Träumen bestehen kann. Ersetzen Sie es beim Ersetzen durch ein nicht verwendetes Zeichen ohne leere Zeichenfolge und löschen Sie dieses Zeichen am Ende, um das richtige Ergebnis zu erhalten. Vielen Dank an @ CuriousFairy315 für diesen Hinweis!

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String S = sc.next();

        S = S.replaceAll("eraser",  "-");
        S = S.replaceAll("erase",   "-");
        S = S.replaceAll("dreamer", "-");
        S = S.replaceAll("dream",   "-");
        S = S.replaceAll("-", "");
        if (S.length() == 0)
            System.out.println("YES");
        else
            System.out.println("NO");
    }
}

Frage 10: ABC 086 C -Traveling

Die Frage ist, bei den Koordinaten (0, 0) zu beginnen und zu bestimmen, ob Sie zum Zeitpunkt ti bei (xi, yi) sein können.

Wenn es möglich ist, die Zielkoordinaten zu einem bestimmten Zeitpunkt zu erreichen, können Sie die Zeit anpassen, indem Sie umherwandern. Wenn Sie jedoch vor der ungeraden Zeit zu den Zielkoordinaten gelangen, ist dies genau der Zeitpunkt Beachten Sie, dass Sie nicht an den gewünschten Koordinaten sein können.

import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int preT = 0;
        int preX = 0;
        int preY = 0;

        for (int i=0; i<N; i++) {
            int postT = sc.nextInt();
            int postX = sc.nextInt();
            int postY = sc.nextInt();

            int dt = postT - preT;
            int dist = Math.abs(postX - preX) + Math.abs(postY - preY);
            if ((dt < dist) || ((dist - dt) % 2 != 0)) {
                System.out.println("No");
                return;
            }

            preT = postT;
            preX = postX;
            preY = postY;
        }

        System.out.println("Yes");
    }
}

abschließend

Ich bin ein Mädchen, das seit ungefähr einem Monat im Wettbewerb ist, daher gibt es wahrscheinlich viele bessere Lösungen. (Bitte lassen Sie es uns in den Kommentaren wissen!)

Java ist im Moment nicht so langsam, aber es ist immer noch langsamer als C und C ++ und nimmt mehr Speicherplatz in Anspruch. Wenn ich die frühere Implementierung in C ++ schreiben würde, könnte ich die 9. Frage normal bestehen. Es wäre schön, wenn die Zeit- und Speicherbeschränkungen für jede Sprache wie AOJ gelockert würden, aber mit AtCoder sind alle Sprachen gleich.

Ich bin der Meinung, dass die Verwendung von C ++ der beste Weg ist, um mit AtCoder zu konkurrieren. (Natürlich macht es Spaß, in anderen Sprachen zu lösen!) Ich selbst studiere derzeit C ++ für einen wettbewerbsfähigen Profi. Wenn Sie ein wettbewerbsfähiger Profi außer C ++ sind, starten wir C ++ zu diesem Zeitpunkt! (C ++ wird in Java-Artikeln empfohlen ...)

Recommended Posts

Ich habe versucht, die letzten 10 Fragen zu lösen, die nach der Registrierung bei AtCoder in Java gelöst werden sollten
Ich habe versucht, 10 ausgewählte Fragen aus der Vergangenheit zu lösen, die nach der Registrierung bei AtCoder mit Java, Stream API, gelöst werden sollten
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby mit Wiederholung zu lösen.
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten
Ich habe das neue Yuan-Problem in Java ausprobiert
[Einführung in Java] Ich habe versucht, das Wissen zusammenzufassen, das ich für wesentlich halte
[Ruby] Ich habe versucht, die häufigen Methoden in Paiza zusammenzufassen
[Ruby] Ich habe versucht, die häufigen Methoden mit paiza ② zusammenzufassen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, die Sitzung in Rails zu organisieren
Ich habe versucht, das Problem der Tribonacci-Sequenz in Ruby zu lösen (Zeitlimit 10 Minuten).
Ich habe versucht, neunundneunzig in Java auszugeben
Ich habe ein Programm erstellt, das aus dem mit Java überladenen Prozess nach der Zielklasse sucht
Ich wusste nicht, dass innere Klassen in der [Java] -Schnittstelle definiert werden können
Ich habe versucht, Alexa-Fähigkeiten mit Java zu erstellen
Ich habe versucht, den Block mit Java zu brechen (1)
Ich möchte den Pfad nach der neuen Registrierung ändern, nachdem ich mich mit mehreren Geräten angemeldet habe.
Die Geschichte, dass die vom Java-Konstruktor aufgerufene Methode zur Variableninitialisierung nicht überschrieben werden sollte
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
[Java] Ich habe versucht, Paizas B-Rang-Problem zu lösen
# 2 [Anmerkung] Ich habe versucht, neunundneunzig mit Java zu berechnen.
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
~ Ich habe jetzt versucht, funktionale Programmierung mit Java zu lernen ~
Ich habe versucht herauszufinden, was sich in Java 9 geändert hat
Ich habe die topologische Sortierung nicht verstanden, also habe ich sie nachgeschlagen und in BFS implementiert und dann versucht, das AtCoder-Problem zu lösen.
Ich habe versucht, mit dem Alexa Skills Kit (ASK) eine Echo-Fähigkeit von Amazon zu erstellen, die kratzte Informationen in Java anzeigt.
Ich habe mir die Rosen von Versailles angesehen und versucht, das Schlusslied in Java zu reproduzieren
Nachdem ich einen Artikel mit Rails Simple Calendar veröffentlicht habe, möchte ich ihn im Kalender wiedergeben.
[Java] Ich habe versucht, ein Janken-Spiel zu erstellen, das Anfänger auf der Konsole ausführen können
Ich habe ein Rätsel ausprobiert, das nur von den unteren 10% der schlechten Ingenieure gelöst werden kann
Ich habe versucht, ein Programm in Java zu erstellen, das das Problem des Handlungsreisenden mit einem genetischen Algorithmus löst
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[Java] ArrayList → Sollte die Größe bei der Array-Konvertierung angegeben werden?
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich habe versucht, in Java von einer Zeichenfolge in einen LocalDate-Typ zu konvertieren
Ich habe versucht, Dapr in Java zu verwenden, um die Entwicklung von Mikroservices zu erleichtern
Ich habe einen RESAS-API-Client in Java erstellt
Stellen Sie sicher, dass Sie das Java compareTo-Ergebnis mit 0 vergleichen
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Ich habe versucht, mit Ractor mehrere Objekte übergeben zu können
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
Ich habe versucht, die Ergebnisse vor und nach der Date-Klasse mit einer geraden Zahl auszudrücken
[Java] Ich möchte überprüfen, ob die Elemente in der Liste null oder leer sind. [Collection Utils]
Nachdem ich Progate gelernt hatte, versuchte ich, eine SNS-Anwendung mit Rails in der lokalen Umgebung zu erstellen