[Java] J'ai essayé de résoudre le problème de rang B de Paiza

introduction

J'ai essayé de résoudre "" Nombre moyen maximum de visiteurs quotidiens (équivalent au rang de paiza B) "" à partir de la vérification des compétences après la collecte de problèmes (édition Java): blush: Je suis nouveau dans la programmation, mais j'ai résumé la partie algorithme d'une manière facile à comprendre! À propos, l'auteur est de rang B sans expérience pratique. ..

[Lien du problème] https://paiza.jp/works/mondai/skillcheck_archive/max_range?language_uid=java

table des matières

--Problème --Flow de la façon de résoudre --Code de réponse

problème

Énoncé du problème

Vous contrôliez un site Web. J'ai mené une campagne sur ce site pendant une série de k jours, mais j'ai oublié combien de temps cela a pris.

Heureusement, nous avons des journaux d'accès pour les n jours de fonctionnement du site Web et nous connaissons le nombre de visiteurs par jour. Pour le moment, j'ai décidé de considérer la période avec le plus grand nombre moyen de visiteurs par jour parmi les k jours consécutifs comme un candidat pour la période pendant laquelle la campagne s'est déroulée.

n jours de visiteurs et k jours de campagne seront saisis, veuillez donc indiquer le nombre de candidats pour la période de campagne et la première date de début parmi les candidats.


Valeur à saisir

L'entrée se compose de deux lignes. Sur la première ligne, n et k sont entrés séparés par un espace demi-largeur. Dans la deuxième ligne, n entiers a_1, a_2,…, a_n sont entrés séparés par des espaces demi-largeur. a_i représente le nombre de visiteurs le jour i.


Sortie attendue

Veuillez indiquer le nombre de candidats pour la période de campagne et la première date de début parmi les candidats dans cet ordre, séparés par des espaces demi-largeur sur une ligne.


Conditions

Dans tous les cas de test, les conditions suivantes sont remplies. ・ 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

Pour plus de détails, veuillez vérifier ** ici ** pour vérifier le problème!

Flux de résolution

1. Pensez au flux général

J'écris généralement le flux général en commentant, puis j'écris le code. Cette fois, je l'ai dessiné dans un diagramme pour une compréhension facile! 日別訪問者問題.png

2. Écrivez le code

Si vous pensez au flux général, j'écrirai le code. J'écrirai le code en fonction de chaque processus. J'essaie de diviser les parties où la portée est susceptible d'être longue en méthodes.


① Entrée 1

L'entrée standard utilise la classe Scanner. image.png

 // Contribution
	Scanner sc = new Scanner(System.in);
 // Nombre de jours pendant lesquels le journal d'accès est resté n
	int n = sc.nextInt();
 // Nombre de jours pendant lesquels la campagne a eu lieu k
	int k = sc.nextInt();

② Entrée 2

image.png Divisez en méthodes. Tout d'abord, écrivez l'initialisation du tableau et l'appel de la méthode. ↓

 // Tableau du nombre de visiteurs sur N jours
	int[] visitorCount = new int[n];
 // Entrez le nombre de visiteurs (n jours)
	visitorCount = inputVisitor(n, visitorCount, sc);

Ensuite, j'écrirai le contenu de la méthode. ↓

	/** 
 * Méthode pour saisir le nombre de visiteurs (n jours)
 * @param n Nombre de jours pendant lesquels le journal d'accès est resté n
 * @param visitorCount Tableau de nombre de visiteurs sur N jours
 * @param sc Entrée standard
 * @return Un tableau avec le nombre de visiteurs entrés
	 */
	private static int[] inputVisitor(int n, int[] visitorCount, Scanner sc) {
		for(int i = 0; i < n; i++) {
			visitorCount[i] = sc.nextInt();
		}
		return visitorCount;
	}

③ Créez un tableau des valeurs totales des visiteurs pendant k jours

image.png Divisez en méthodes. Tout d'abord, écrivez l'initialisation du tableau et l'appel de la méthode. ↓

 // Tableau du nombre total de visiteurs pendant k jours [n --k + 1]
	int[] visitorSumCount = new int[n - k + 1];
 // Calculer visiteurSumCount
	visitorSumCount = visitorSum(visitorCount, n, k, visitorSumCount);

Ensuite, j'écrirai le contenu de la méthode. ↓

	/** 
 * Calculez le nombre total de visiteurs pour k jours ((n --k + 1) fois)
 * @param visitorCount Tableau de nombre de visiteurs sur N jours
 * @param n Nombre de jours pendant lesquels le journal d'accès est resté n
 * @param k Nombre de jours pendant lesquels la campagne a eu lieu k
 * @param visiteurSumCount Un tableau du nombre total de visiteurs pendant k jours
 * @return Un tableau qui calcule le nombre total de visiteurs pendant k jours
	 */
	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;
	}

④ Trouvez la valeur Max dans le nombre total de visiteurs

image.png Divisez en méthodes. Décrivez d'abord l'initialisation des variables et l'appel de méthodes. ↓

 // Valeur maximale dans VisitorSumCount
	int visitorSumMax = 0;
 // Demander un visiteurSumMax
	visitorSumMax = sortVisitorSumMax(visitorSumCount, visitorSumMax);

Ensuite, j'écrirai le contenu de la méthode. ↓

	/**
 * Trouvez la valeur Max dans le nombre total de visiteurs
 * @param visiteurSumCount Un tableau du nombre total de visiteurs pendant k jours
 * @param visiteurSumMax Valeur maximale dans VisitorSumCount
 * @return Valeur maximale obtenue
	 */
	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;
	}

⑤ Mettez la valeur d'index qui devient la valeur Max dans le tableau total des visiteurs dans la liste.

image.png

 // Liste avec les valeurs d'index qui seront visiteurSumMax
	List<Integer> visitorSumMaxStartDay = new ArrayList<>();
 // Demander un visiteurSumMaxStartDay
	visitorSumMaxStartDay = visitorSumMaxStartDaySort(visitorSumCount, visitorSumMax, visitorSumMaxStartDay);

Ensuite, j'écrirai le contenu de la méthode. ↓

	/**
 * Sauvegardez l'index qui devient visiteurSumMax dans VisitorSumCount dans la liste
 * @param visiteurSumCount Un tableau du nombre total de visiteurs pendant k jours
 * @param visiteurSumMax Valeur maximale dans VisitorSumCount
 * @param visiteurSumMaxStartDay Index qui devient visiteurSumMax dans VisitorSumCount
 * @return Renvoie une liste indexée
	 */
	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;
	}

⑥ Sortie

image.png

C'est le dernier! visiteurSumMaxStartDay Renvoie le nombre d'éléments de la liste et la valeur de l'index (0) + 1.

 // Affiche le nombre de jours candidats
	System.out.print(visitorSumMaxStartDay.size() + " ");
 // Sortie le premier jour de la date du candidat
	System.out.print(visitorSumMaxStartDay.get(0) + 1);

Code de réponse

Enfin, je posterai le code de réponse!

import java.util.*;

public class PaizaB01Visitors {

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
 // Nombre de jours pendant lesquels le journal d'accès est resté n
		int n = sc.nextInt();
 // Nombre de jours pendant lesquels la campagne a eu lieu k
		int k = sc.nextInt();

 // Tableau du nombre de visiteurs sur N jours
		int[] visitorCount = new int[n];
 // Entrez le nombre de visiteurs (n jours)
		visitorCount = inputVisitor(n, visitorCount, sc);

 // Tableau du nombre total de visiteurs pendant k jours [n --k + 1]
		int[] visitorSumCount = new int[n - k + 1];
 // Calculer visiteurSumCount
		visitorSumCount = visitorSum(visitorCount, n, k, visitorSumCount);

 // Valeur maximale dans VisitorSumCount
		int visitorSumMax = 0;
 // Demander un visiteurSumMax
		visitorSumMax = sortVisitorSumMax(visitorSumCount, visitorSumMax);

 // Liste avec les valeurs d'index qui seront visiteurSumMax
		List<Integer> visitorSumMaxStartDay = new ArrayList<>();
 // Demander un visiteurSumMaxStartDay
		visitorSumMaxStartDay = visitorSumMaxStartDaySort(visitorSumCount, visitorSumMax, visitorSumMaxStartDay);

 // Affiche le nombre de jours candidats
		System.out.print(visitorSumMaxStartDay.size() + " ");
 // Sortie le premier jour de la date du candidat
		System.out.print(visitorSumMaxStartDay.get(0) + 1);

		sc.close();
	}

	/**
 * Méthode pour saisir le nombre de visiteurs (n jours)
 * @param n Nombre de jours pendant lesquels le journal d'accès est resté n
 * @param visitorCount Tableau de nombre de visiteurs sur N jours
 * @param sc Entrée standard
 * @return Un tableau avec le nombre de visiteurs entrés
	 */
	private static int[] inputVisitor(int n, int[] visitorCount, Scanner sc) {
		for(int i = 0; i < n; i++) {
			visitorCount[i] = sc.nextInt();
		}
		return visitorCount;
	}

	/**
 * Calculez le nombre total de visiteurs pour k jours ((n --k + 1) fois)
 * @param visitorCount Tableau de nombre de visiteurs sur N jours
 * @param n Nombre de jours pendant lesquels le journal d'accès est resté n
 * @param k Nombre de jours pendant lesquels la campagne a eu lieu k
 * @param visiteurSumCount Un tableau du nombre total de visiteurs pendant k jours
 * @return Un tableau qui calcule le nombre total de visiteurs pendant k jours
	 */
	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;
	}

	/**
 * Trouvez la valeur Max dans le nombre total de visiteurs
 * @param visiteurSumCount Un tableau du nombre total de visiteurs pendant k jours
 * @param visiteurSumMax Valeur maximale dans VisitorSumCount
 * @return Valeur maximale obtenue
	 */
	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;
	}

	/**
 * Sauvegardez l'index qui devient visiteurSumMax dans VisitorSumCount dans la liste
 * @param visiteurSumCount Un tableau du nombre total de visiteurs pendant k jours
 * @param visiteurSumMax Valeur maximale dans VisitorSumCount
 * @param visiteurSumMaxStartDay Index qui devient visiteurSumMax dans VisitorSumCount
 * @return Renvoie une liste indexée
	 */
	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;
	}
}

en conclusion

Merci d'avoir regardé jusqu'à présent! Si vous avez des commentaires ou des améliorations, nous vous serions reconnaissants de bien vouloir commenter.

Recommended Posts

[Java] J'ai essayé de résoudre le problème de rang B de Paiza
J'ai essayé d'interagir avec Java
J'ai essayé de résumer l'apprentissage Java (1)
J'ai essayé de résumer Java 8 maintenant
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé de résumer les expressions Java lambda
J'ai essayé de résoudre la recherche binaire d'AOJ
J'ai essayé de résoudre le problème de la campagne paiza "Challenge from Phantom Thief 813"
J'ai essayé de résoudre le problème de Google Tech Dev Guide
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
J'ai essayé de faire une authentification de base avec Java
java j'ai essayé de casser un simple bloc
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
Comment résoudre les problèmes d'expression en Java
J'ai essayé de créer une compétence Alexa avec Java
[Java] Essayez de résoudre le problème de Fizz Buzz
J'ai essayé de casser le bloc avec java (1)
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby (temps limite 10 minutes)
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
J'ai essayé d'implémenter la notification push Firebase en Java
paiza Ce que j'ai fait pour devenir Ruby B rang
J'ai essayé de faire fonctionner SQS en utilisant AWS Java SDK
# 2 [Note] J'ai essayé de calculer quatre-vingt-dix-neuf avec Java.
J'ai essayé de résoudre Small, Large ou Equal d'AOJ
J'ai essayé de créer une compétence Clova en Java
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé d'implémenter Sterling Sort avec Java Collector
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
Essayez de résoudre un problème FizzBuzz restreint en Java
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
~ J'ai essayé d'apprendre la programmation fonctionnelle avec Java maintenant ~
J'ai essayé de découvrir ce qui avait changé dans Java 9
J'ai essayé Drools (Java, InputStream)
J'ai essayé d'utiliser Java REPL
J'ai essayé le problème FizzBuzz
J'ai essayé de vérifier yum-cron
J'ai essayé la métaprogrammation avec Java
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
J'ai essayé de résumer les bases de kotlin et java
J'ai essayé de faire coexister Java Optional et la clause de garde
J'ai essayé de convertir une chaîne de caractères en un type LocalDate en Java
J'ai essayé d'utiliser Dapr en Java pour faciliter le développement de microservices
J'ai créé un client RESAS-API en Java
J'ai essayé de résoudre le problème de la machine à karaoké Ruby (il y a un exemple de réponse)
J'ai essayé de résoudre le problème de la boisson bonus Ruby (il y a un exemple de réponse)
[Java] Essayez de résoudre le problème de Fizz Buzz en utilisant un traitement récursif
J'ai essayé de mâcher C # (indexeur)
J'ai essayé de résumer le support d'iOS 14
J'ai essayé de configurer les débutants Java pour qu'ils utilisent des touches de raccourci dans eclipse
J'ai essayé de résoudre le problème de création de carte de bingo Ruby (il y a un exemple de réponse)
J'ai essayé la communication UDP avec Java
J'ai essayé d'expliquer la méthode
J'ai essayé de traduire le message d'erreur lors de l'exécution d'Eclipse (Java)
J'ai essayé le framework Java "Quarkus"
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé de créer une application Android avec MVC maintenant (Java)
J'ai essayé d'utiliser JWT en Java