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
--Problème --Flow de la façon de résoudre --Code de réponse
É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!
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!
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.
L'entrée standard utilise la classe Scanner.
// 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();
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;
}
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;
}
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;
}
// 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;
}
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);
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;
}
}
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