[JAVA] ABC --020 --A & B & C

AtCoder ABC 020 A&B&C AtCoder - 020

** 2019/05/16 ** - Ajout du nom du problème

Un quiz

	private void solveA() {
		int n = nextInt();

		out.println(n == 1 ? "ABC" : "chokudai");
	}

B --Takahashi-kun et compression de chaînes de caractères

	private void solveB() {
		String res = IntStream.range(0, 2).mapToObj(i -> next()).collect(Collectors.joining());

		out.println(Integer.parseInt(res) * 2);
	}

C --Wall through: AC avec DFS (Memo Recursive)

La solution hypothétique est la suivante

  1. Calcul de l'itinéraire le plus court avec Worshall Floyd / Bellmanford / Dyxtra
  2. Affiner t par dichotomie

Au début, j'y ai pensé de la même manière que la méthode de solution supposée, donc je l'ai implémentée avec Worshall Floyd, mais même si cela passe par un échantillon ou mon cas de test supposé, lorsque je le lance réellement au juge, environ un quart devient WA. , Je ne connais pas la raison de WA, alors j'ai abandonné et mis en œuvre avec DFS. Je dois encore le résoudre quelque part avec la méthode de solution supposée.   ** Si vous êtes un Worshall Floyd, dites-moi s'il vous plaît que quelqu'un regarde vraiment la source et devient WA **

Un mémorandum lorsqu'il est mis en œuvre par conversion de mémo (contre-mesures TLE)

―― Certaines des méthodes de mise en œuvre considérées comme acquises sont plus lentes que prévu. --Au début, c'était TLE tout le temps, donc à la suite de la vérification tout en modifiant du code, TLE pouvait être résolu à la fois juste en arrêtant ce qui suit (en fait, en le modifiant, il peut être nul sans valeur de retour. Mais c'était subtilement efficace pour le rendre nul)

	private void solveC() {
		int h = nextInt();
		int w = nextInt();
		long t = nextLong();
		char[][] wk = new char[h][w];

		int sX = 0;
		int sY = 0;
		int gX = 0;
		int gY = 0;
		for (int i = 0; i < wk.length; i++) {
			wk[i] = next().toCharArray();
			for (int j = 0; j < wk[i].length; j++) {
				if (wk[i][j] == 'S') {
					sX = i;
					sY = j;
				} else if (wk[i][j] == 'G') {
					gX = i;
					gY = j;
				}
			}
		}
		long low = 1;
		long high = t;
		long[][] memo = new long[h][w];

		while (high - low != 1) {
			long mid = (high + low) / 2;
			for (long[] l : memo) {
				Arrays.fill(l, Long.MAX_VALUE);
			}
			dfsC(wk, h, w, t, sX, sY, mid, 0, memo, new boolean[h][w]);
			if (memo[gX][gY] <= t) {
				low = mid;
			} else {
				high = mid;
			}
		}

		out.println(low);
	}


	static final int[] dx = new int[] { 0, 0, -1, 1 };
	static final int[] dy = new int[] { 1, -1, 0, 0 };

	private void dfsC(char[][] wk, int h, int w, long t, int currentH, int currentW, long x, long val,
			long[][] dist, boolean[][] pass) {

		/*
		 *Dépassement de la plage de recherche
		 *Ou
		 *Déjà recherché
		 */
		if (currentH < 0 || currentH >= h || currentW < 0 || currentW >= w || pass[currentH][currentW]) {
			return;
		}

		/*
		 *Aucune recherche supplémentaire n'est requise si la valeur actuelle est inférieure à la valeur déjà dans
		 *Aucune recherche supplémentaire n'est requise si la valeur actuelle dépasse t
		 */
		if (dist[currentH][currentW] < val || val > t) {
			return;
		} else {
			/*
			 *Mettez à jour la valeur car il s'agit d'une cible de recherche
			 *Je veux vraiment le régler sur min, mais je ne peux pas le faire à temps
			 */
			dist[currentH][currentW] = val;
		}
		/*
		 *Parce que c'est G, ça se termine
		 */
		if (wk[currentH][currentW] == 'G' || (val > 0 && wk[currentH][currentW] == 'S')) {
			return;
		}
		pass[currentH][currentW] = true;
		/*
		 *Rechercher dans 4 directions
		 */
		for (int i = 0; i < 4; i++) {
			int wkH = currentH + dx[i];
			int wkW = currentW + dy[i];
			if (wkH < 0 || wkH >= h || wkW < 0 || wkW >= w) {
				continue;
			}
			long currVal = 0;
			switch (wk[wkH][wkW]) {
			case 'S':
			case 'G':
			case '.':
				currVal = 1;
				break;
			case '#':
				currVal = x;
				break;
			default:
				break;
			}

			dfsC(wk, h, w, t, wkH, wkW, x, val + currVal, dist, pass);
		}
		pass[currentH][currentW] = false;
	}

Recommended Posts

ABC --013-A et B et C
ABC --036-A et B et C
ABC --010 --A & B & C
ABC --028 --A & B & C
ABC --015 --A & B & C
ABC --128 --A & B & C
ABC --012-A et B et C
ABC --018 --A & B & C
ABC --017 --A & B & C
ABC --029- A & B & C
ABC --022 --A & B & C
ABC --019 --A & B & C
ABC --020 --A & B & C
ABC --030- A & B & C
ABC --127 --A & B & C
ABC --007 --A & B & C
ABC --132- A & B & C
ABC --026 --A & B & C
ABC --014- A & B & C
ABC --016 --A & B & C
ABC --011-A et B et C
ABC --031 --A & B & C
ABC --021 --A & B & C
ABC --025 --A & B & C
ABC --024 --A & B & C
ABC --027 --A & B & C
ABC --080- A & B & C
ABC --129- A & B & C & D
ABC --133- A & B & C & D
ABC --122 --A & B & C & D
ABC --125- A & B & C & D
ABC --130- A & B & C & D
ABC --126 --A & B & C & D
ABC --134- A & B & C & D & E
ABC --131- A & B & C & D & E
Concours de programmation diverta 2019 A & B & C & D
AtCoder Beginner Contest 169 A, B, C avec rubis
Problème atcoder ABC113 C
ABC093 C - Mêmes entiers
problème atcoder ABC115 C
AtCoder Beginner Contest 170 A, B, C jusqu'au rubis
Une personne écrivant C ++ a essayé d'écrire Java
Faire un appel SOAP en C #
Appeler les fonctions du langage C depuis Swift
NLP4J [006-034] 100 coups de traitement de langage avec NLP4J # 34 "A B"