Ich habe versucht, "Maximale durchschnittliche Anzahl täglicher Besucher (entspricht Paiza-Rang B)" aus der Skill-Check-Problemsammlung (Java Edition) zu lösen: erröten: Ich bin neu in der Programmierung, aber ich habe den Algorithmus-Teil auf leicht verständliche Weise zusammengefasst! Der Autor ist übrigens B-Rang ohne praktische Erfahrung. ..
[Problem Link] https://paiza.jp/works/mondai/skillcheck_archive/max_range?language_uid=java
--Problem
Problemstellung
Sie hatten die Kontrolle über eine Website. Ich habe eine Reihe von k Tagen lang eine Kampagne auf dieser Website durchgeführt, aber vergessen, wie lange es gedauert hat.
Glücklicherweise haben wir Zugriffsprotokolle für alle n Tage, an denen die Website ausgeführt wird, und wir kennen die Anzahl der Besucher pro Tag. Vorerst habe ich beschlossen, den Zeitraum mit der höchsten durchschnittlichen Besucherzahl pro Tag unter den k aufeinander folgenden Tagen als Kandidaten für den Zeitraum zu betrachten, in dem die Kampagne durchgeführt wurde.
Besucher im Wert von n Tagen und Kampagnentage k werden eingegeben. Geben Sie daher die Anzahl der Kandidaten für den Kampagnenzeitraum und das früheste Startdatum unter den Kandidaten ein.
einzugebender Wert
Der Eingang besteht aus 2 Zeilen. In der ersten Zeile werden n und k durch ein Leerzeichen halber Breite getrennt eingegeben. In der zweiten Zeile werden n ganze Zahlen a_1, a_2,…, a_n eingegeben, die durch Leerzeichen halber Breite getrennt sind. a_i repräsentiert die Anzahl der Besucher am Tag i.
Erwartete Ausgabe
Bitte geben Sie die Anzahl der Kandidaten für den Kampagnenzeitraum und das früheste Startdatum unter den Kandidaten in dieser Reihenfolge ein, getrennt durch Leerzeichen halber Breite in einer Zeile.
Bedingungen
In allen Testfällen sind folgende Bedingungen erfüllt. ・ 1 ≤ n ≤ 1.000 ・ 1 ≤ k ≤ n ・ 0 ≤ a_i ≤ 100
5 3 1 2 3 2 1
1 2
10 2 6 2 0 7 1 3 5 3 2 6
5 1
Weitere Informationen finden Sie unter ** hier **, um das Problem zu überprüfen!
Normalerweise schreibe ich den allgemeinen Ablauf durch Auskommentieren und schreibe dann den Code. Dieses Mal habe ich es zum leichteren Verständnis in ein Diagramm gezeichnet!
Wenn Sie über den allgemeinen Ablauf nachdenken, werde ich den Code schreiben. Ich werde den Code für jeden Prozess schreiben. Ich versuche, die Teile, bei denen der Umfang wahrscheinlich lang ist, in Methoden zu unterteilen.
Die Standardeingabe verwendet die Scannerklasse.
// Eingabe
Scanner sc = new Scanner(System.in);
// Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
int n = sc.nextInt();
// Anzahl der Tage, an denen die Kampagne durchgeführt wurde k
int k = sc.nextInt();
In Methoden aufteilen. Schreiben Sie zunächst die Initialisierung des Arrays und den Aufruf der Methode. ↓
// N-Tage-Besucheranzahl-Array
int[] visitorCount = new int[n];
// Anzahl der Besucher eingeben (n Tage)
visitorCount = inputVisitor(n, visitorCount, sc);
Als nächstes werde ich den Inhalt der Methode schreiben. ↓
/**
* Methode zur Eingabe der Besucherzahl (n Tage)
* @param n Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
* @param VisitorCount N-Day Besucheranzahl Array
* @param sc Standardeingabe
* @return Ein Array mit der Anzahl der eingegebenen Besucher
*/
private static int[] inputVisitor(int n, int[] visitorCount, Scanner sc) {
for(int i = 0; i < n; i++) {
visitorCount[i] = sc.nextInt();
}
return visitorCount;
}
In Methoden aufteilen. Schreiben Sie zunächst die Initialisierung des Arrays und den Aufruf der Methode. ↓
// Array der Gesamtzahl der Besucher für k Tage [n - k + 1]
int[] visitorSumCount = new int[n - k + 1];
// Besucherzahl berechnen
visitorSumCount = visitorSum(visitorCount, n, k, visitorSumCount);
Als nächstes werde ich den Inhalt der Methode schreiben. ↓
/**
* Berechnen Sie die Gesamtzahl der Besucher für k Tage ((n - k + 1) mal)
* @param VisitorCount N-Day Besucheranzahl Array
* @param n Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
* @param k Anzahl der Tage, an denen die Kampagne durchgeführt wurde k
* @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
* @return Ein Array, das die Gesamtzahl der Besucher für k Tage berechnet
*/
private static int[] visitorSum(int[] visitorCount, int n, int k, int[] visitorSumCount) {
for(int i = 0; i < (n - k + 1); i++) {
for(int j = i; j < (k + i); j++) {
visitorSumCount[i] += visitorCount[j];
}
}
return visitorSumCount;
}
In Methoden aufteilen. Beschreiben Sie zunächst die Initialisierung von Variablen und den Aufruf von Methoden. ↓
// Maximaler Wert in VisitorSumCount
int visitorSumMax = 0;
// Nach BesucherSumMax fragen
visitorSumMax = sortVisitorSumMax(visitorSumCount, visitorSumMax);
Als nächstes werde ich den Inhalt der Methode schreiben. ↓
/**
* Finden Sie den Maximalwert in der Gesamtzahl der Besucher
* @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
* @param VisitorSumMax Maximaler Wert in VisitorSumCount
* @return Erhaltener Maximalwert
*/
private static int sortVisitorSumMax(int[] visitorSumCount, int visitorSumMax) {
for(int i = 0; i < visitorSumCount.length; i++) {
if(visitorSumCount[i] > visitorSumMax) {
visitorSumMax = visitorSumCount[i];
}
}
return visitorSumMax;
}
// Liste mit Indexwerten, die besucherSumMax sein werden
List<Integer> visitorSumMaxStartDay = new ArrayList<>();
// Nach BesucherSumMaxStartDay fragen
visitorSumMaxStartDay = visitorSumMaxStartDaySort(visitorSumCount, visitorSumMax, visitorSumMaxStartDay);
Als nächstes werde ich den Inhalt der Methode schreiben. ↓
/**
* Speichern Sie den Index, der besucherSumMax wird, in besucherSumCount in der Liste
* @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
* @param VisitorSumMax Maximaler Wert in VisitorSumCount
* @param besucherSumMaxStartDay Index, der in visitersumCount zu besucherSumMax wird
* @return Gibt eine indizierte Liste zurück
*/
private static List<Integer> visitorSumMaxStartDaySort(int[] visitorSumCount, int visitorSumMax, List<Integer> visitorSumMaxStartDay) {
for(int i = 0; i < visitorSumCount.length; i++) {
if(visitorSumCount[i] == visitorSumMax) {
visitorSumMaxStartDay.add(i);
}
}
return visitorSumMaxStartDay;
}
Das ist das letzte! BesucherSumMaxStartDay Gibt die Anzahl der Elemente in der Liste und den Wert von Index (0) + 1 aus.
// Die Anzahl der Kandidatentage ausgeben
System.out.print(visitorSumMaxStartDay.size() + " ");
// Den ersten Tag des Kandidatendatums ausgeben
System.out.print(visitorSumMaxStartDay.get(0) + 1);
Zum Schluss werde ich den Antwortcode posten!
import java.util.*;
public class PaizaB01Visitors {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
// Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
int n = sc.nextInt();
// Anzahl der Tage, an denen die Kampagne durchgeführt wurde k
int k = sc.nextInt();
// N-Tage-Besucheranzahl-Array
int[] visitorCount = new int[n];
// Anzahl der Besucher eingeben (n Tage)
visitorCount = inputVisitor(n, visitorCount, sc);
// Array der Gesamtzahl der Besucher für k Tage [n - k + 1]
int[] visitorSumCount = new int[n - k + 1];
// Besucherzahl berechnen
visitorSumCount = visitorSum(visitorCount, n, k, visitorSumCount);
// Maximaler Wert in VisitorSumCount
int visitorSumMax = 0;
// Nach BesucherSumMax fragen
visitorSumMax = sortVisitorSumMax(visitorSumCount, visitorSumMax);
// Liste mit Indexwerten, die besucherSumMax sein werden
List<Integer> visitorSumMaxStartDay = new ArrayList<>();
// Nach BesucherSumMaxStartDay fragen
visitorSumMaxStartDay = visitorSumMaxStartDaySort(visitorSumCount, visitorSumMax, visitorSumMaxStartDay);
// Die Anzahl der Kandidatentage ausgeben
System.out.print(visitorSumMaxStartDay.size() + " ");
// Den ersten Tag des Kandidatendatums ausgeben
System.out.print(visitorSumMaxStartDay.get(0) + 1);
sc.close();
}
/**
* Methode zur Eingabe der Besucherzahl (n Tage)
* @param n Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
* @param VisitorCount N-Day Besucheranzahl Array
* @param sc Standardeingabe
* @return Ein Array mit der Anzahl der eingegebenen Besucher
*/
private static int[] inputVisitor(int n, int[] visitorCount, Scanner sc) {
for(int i = 0; i < n; i++) {
visitorCount[i] = sc.nextInt();
}
return visitorCount;
}
/**
* Berechnen Sie die Gesamtzahl der Besucher für k Tage ((n - k + 1) mal)
* @param VisitorCount N-Day Besucheranzahl Array
* @param n Anzahl der Tage, an denen das Zugriffsprotokoll n blieb
* @param k Anzahl der Tage, an denen die Kampagne durchgeführt wurde k
* @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
* @return Ein Array, das die Gesamtzahl der Besucher für k Tage berechnet
*/
private static int[] visitorSum(int[] visitorCount, int n, int k, int[] visitorSumCount) {
for(int i = 0; i < (n - k + 1); i++) {
for(int j = i; j < (k + i); j++) {
visitorSumCount[i] += visitorCount[j];
}
}
return visitorSumCount;
}
/**
* Finden Sie den Maximalwert in der Gesamtzahl der Besucher
* @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
* @param VisitorSumMax Maximaler Wert in VisitorSumCount
* @return Erhaltener Maximalwert
*/
private static int sortVisitorSumMax(int[] visitorSumCount, int visitorSumMax) {
for(int i = 0; i < visitorSumCount.length; i++) {
if(visitorSumCount[i] > visitorSumMax) {
visitorSumMax = visitorSumCount[i];
}
}
return visitorSumMax;
}
/**
* Speichern Sie den Index, der besucherSumMax wird, in besucherSumCount in der Liste
* @param visitSumCount Ein Array von Gesamtbesuchern für k Tage
* @param VisitorSumMax Maximaler Wert in VisitorSumCount
* @param besucherSumMaxStartDay Index, der in visitersumCount zu besucherSumMax wird
* @return Gibt eine indizierte Liste zurück
*/
private static List<Integer> visitorSumMaxStartDaySort(int[] visitorSumCount, int visitorSumMax, List<Integer> visitorSumMaxStartDay) {
for(int i = 0; i < visitorSumCount.length; i++) {
if(visitorSumCount[i] == visitorSumMax) {
visitorSumMaxStartDay.add(i);
}
}
return visitorSumMaxStartDay;
}
}
Vielen Dank für das bisherige Anschauen! Wenn Sie Kommentare oder Verbesserungen haben, würden wir uns freuen, wenn Sie Kommentare abgeben könnten.
Recommended Posts