Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java

Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java

Programmation de compétition Java X

Je pense que le goulot d'étranglement lors de la participation à une programmation compétitive en Java est la limitation du temps d'exécution. Dans certains cas, la plateforme à laquelle je participe prend 20 à 20 fois plus longtemps que C ++ 14 et 4 fois plus longtemps que Python3 (Java8 OpenJDK 1.8.0).

Même si j'ai trouvé la logique pour résoudre le problème, j'ai souvent le sentiment que je ne peux pas le terminer car la réponse n'est pas correcte en raison de la limitation du temps d'exécution.

Par conséquent, je voudrais partager le contenu des problèmes difficiles que j'ai récemment rencontrés et les mesures et politiques pour ces problèmes. C'est une note d'un codeur débutant (pas humble), alors n'hésitez pas à commenter.

Trouvez la médiane

  • Compte tenu de l'entrée de 2 ou plus de A pairs et de 1 ou plus de nombres naturels A, le centre de l'ensemble pour un nombre impair de nombres à l'exclusion d'un entier A dans chaque ordre d'entrée Sortez les valeurs dans l'ordre. *
  • Cependant ・ Il est garanti que A vaut toujours 10 ^ 5 ou moins. -Il est garanti que toutes les entrées sont des entiers. *
  • Exemple de traitement: * input *6 (==A) 7 1 4 2 6 9 (Saisie d'un ou plusieurs nombres naturels donnés (donné comme cas de test)) *

output

Cliquez ici pour une description de la médiane https://ja.wikipedia.org/wiki/%E4%B8%AD%E5%A4%AE%E5%80%A4

Comment résoudre

Du contenu du problème

** - Stocke la valeur saisie dans un tableau numérique (dans Array ou ArrayList). ** ** ** - Supprimer les éléments dans l'ordre de ce tableau. ** ** ** - Trier le tableau. ** ** ** ・ (A / 2) -Sortir la première valeur. ** **

Vous pouvez voir le déroulement du traitement. Cela signifie

-Supprimer les éléments dans l'ordre de ce tableau. -Trier le tableau. ・ (A / 2) -Sortir la première valeur. Il vous suffit d'écrire le processus itératif.

Voici le premier code que j'ai écrit.

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();
    		}
    	}
    }

Cependant, ce code dépassera le temps d'exécution dans l'environnement de production. Out car la liste est supprimée, triée et dupliquée pour A fois à la position ★. La classe ArrayList a un nombre variable d'éléments, mais a la propriété qu'elle a tendance à s'exécuter plus lentement que la classe Array.

Comment respecter les contraintes de temps

À propos, le contenu de la tâche était de sortir la valeur médiane de chacun. Et vous devez supprimer les éléments un par un et spécifier la valeur médiane, mais vous ne devez pas utiliser ArrayList. …

En fait, la valeur médiane de ce problème, ** peu importe le nombre d'éléments, il y a deux candidats **.

Par exemple

1,2,3,4,5,6

Étant donné le nombre, même si vous supprimez les nombres un par un de 1 à 6, la valeur médiane sera toujours ** 3 ** ou ** 4 **.

Lorsque 1,2,3 sont supprimés, 4 est la valeur médiane, Lorsque 4,5,6 est supprimé, 3 est déterminé comme valeur médiane.

Voici le code que j'ai écrit après avoir pris cela en compte.

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);
    			}
    		}
     
    	}
    }

Il en va de même jusqu'au point où les nombres saisis sont stockés dans le tableau (bien que la classe du tableau soit différente). Après cela, (n / 2) -stocker les 1er et n / 2ème nombres comme valeurs int, respectivement. Ensuite, il compare le nombre supprimé avec le petit nombre de candidats médians et génère une valeur arbitraire.

Dans ce code, vous n'avez pas à manipuler le tableau dans l'instruction de sortie. Et même en Java, même si les éléments du tableau sont variables, vous pouvez garder la contrainte de temps.

Comment faire face aux contraintes de temps

Tout d'abord, dans un premier temps, il est faux de supposer que la valeur médiane de chaque tableau supprimé change dynamiquement. Le facteur qui a fait une telle prémisse est l'impatience que "je dois écrire le code rapidement et le soumettre".

Je pense que la programmation de compétition est un environnement spécial pour les codeurs, et pour la plupart des participants, je dois écrire du code qui fonctionne dans les périodes de compétition difficiles. En d'autres termes, il est facile de s'impatienter car vous voulez écrire du code rapidement.

Pour ceux qui sont habitués dans une certaine mesure (ceux qui peuvent répondre à des questions autres que celles qui ne peuvent répondre qu'à quelques pour cent du total), le temps requis est un facteur plus important pour déterminer le classement des participants que le nombre de réponses correctes à la question. Surtout.

Cependant, dans un environnement contraint, plus lors de la participation à une programmation compétitive telle que Java dans un langage «désavantageux» ・ Ecrire plusieurs processus dans une phrase répétitive, ・ Utilisez des cours pratiques

plutôt que, ・ Examiner les règles pour les réponses ・ Même si des instructions répétées sont utilisées, le traitement qu'elles contiennent est minimisé.

C'est une stratégie importante, qui est également un commandement pour moi, et je voulais la partager cette fois.

C'est tout. Si vous avez des erreurs ou d'autres solutions, veuillez nous en informer dans les commentaires.

Recommended Posts

Une histoire que j'ai eu du mal à défier le pro de la concurrence avec Java
J'ai essayé de casser le bloc avec java (1)
Je voulais écrire un processus équivalent à une instruction while avec l'API Java 8 Stream
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.
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Osez défier Kaggle avec Java (1)
J'ai essayé d'interagir avec Java
Je veux écrire une boucle qui fait référence à un index avec l'API Stream de Java 8
Une histoire qui a eu du mal avec l'introduction de Web Apple Pay
Une histoire que j'ai finalement comprise Java pour une déclaration en tant que non-ingénieur
Java: Une histoire qui m'a mis mal à l'aise quand on m'a appris à comparer des chaînes avec des égaux sans raison.
Comment gérer le type auquel j'ai pensé en écrivant un programme Java pendant 2 ans
Une application Java autonome qui envoie des journaux à CloudWatch Logs avec slf4j / logback
J'ai essayé d'apprendre Java avec une série que les débutants peuvent comprendre clairement
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
J'ai essayé de créer une API Web qui se connecte à DB avec Quarkus
Je souhaite créer un SNS Web sombre avec Jakarta EE 8 avec Java 11
Je veux ForEach un tableau avec une expression Lambda en Java
Une histoire à laquelle j'étais accro à deux reprises avec le paramètre de démarrage automatique de Tomcat 8 sur CentOS 8
Défi pour gérer les caractères déformés avec Java AudioSystem.getMixerInfo ()
J'ai essayé de faire une authentification de base avec Java
Une histoire qui a mis du temps à établir une connexion
java j'ai essayé de casser un simple bloc
Je l'ai fait en Java pour toujours rendre (a == 1 && a == 2 && a == 3) vrai
Je veux utiliser java8 forEach avec index
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Histoire d'essayer de faire fonctionner le fichier JAVA
[Kotlin] Je voulais générer un png avec une grande capacité par zone [Java]
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (deuxième décoction Javassist)
[Java] J'ai essayé de me connecter en utilisant le pool de connexion avec Servlet (tomcat) & MySQL & Java
[Petite histoire] J'ai essayé de rendre java ArrayList un peu plus pratique
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
Une histoire dans laquelle j'étais vraiment quand j'ai fait triple DES avec ruby
J'ai créé un programme qui recherche la classe cible à partir du processus surchargé avec Java
J'ai essayé de créer une fonction / écran d'administrateur de site commercial avec Java et Spring
Soumettre une tâche à AWS Batch avec Java (Eclipse)
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
Notez que j'étais accro au traitement par lots avec Spring Boot
Même en Java, je veux sortir vrai avec un == 1 && a == 2 && a == 3 (magie grise qui n'est pas tant que magie noire)
J'ai essayé de créer une compétence Clova en Java
Je souhaite surveiller un fichier spécifique avec WatchService
Une histoire d'essayer de s'entendre avec Mockito
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé OCR de traiter un fichier PDF avec Java
J'ai essayé d'implémenter Sterling Sort avec Java Collector
Une histoire sur l'exécution de Sprint-boot avec kubernetes (GKE) et l'échec de la connexion à CloudSQL
Je veux faire des transitions d'écran avec kotlin et java!
Une histoire sur la réduction de la consommation de mémoire à 1/100 avec find_in_batches
J'ai créé un Wrapper qui appelle KNP depuis Java
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (Royal road edition qui n'est ni magique ni rien)
Une histoire sur le développement de ROS appelé rosjava avec java
[Azure] J'ai essayé de créer une application Java gratuitement ~ Se connecter avec FTP ~ [Débutant]
J'avais l'habitude de faire nc (netcat) avec JAVA normalement
[Java] Comment rompre une ligne avec StringBuilder
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis