[JAVA] ABC - 018 - A & B & C.

AtCoder ABC 018 A&B&C AtCoder - 018

A-Mame-Maki

»Aus irgendeinem Grund wollte ich nicht eins nach dem anderen beurteilen, also habe ich es in einer Schleife gedreht --Halten Sie den Anfangsindex und die Punktzahl

	private void solveA() {
		int[][] wk = new int[3][2];
		for (int i = 0; i < 3; i++) {
			wk[i] = new int[] { i, nextInt() };
		}

		Arrays.sort(wk, (x, y) -> -Integer.compare(x[1], y[1]));

		for (int i = 0; i < 3; i++) {
			wk[i][1] = i + 1;
		}

		Arrays.sort(wk, (x, y) -> Integer.compare(x[0], y[0]));

		for (int[] is : wk) {
			out.println(is[1]);
		}

	}

B-invertierte Zeichenfolge

	private void solveB() {
		char[] wk = next().toCharArray();
		int n = nextInt();
		for (int i = 0; i < n; i++) {
			int s = nextInt() - 1;
			int e = nextInt() - 1;
			while (s < e) {
				wk[s] += wk[e];
				wk[e] = (char) (wk[s] - wk[e]);
				wk[s] = (char) (wk[s] - wk[e]);
				s++;
				e--;
			}
		}

		out.println(new String(wk));
	}

C-Rhombus Count: Minenräumer?

――Die Geschwindigkeit ist langsam, aber ich konnte AC. (Zuerst wurde es in einer Schleife implementiert, aber es scheint, dass TLE nicht aufgelöst werden kann, also habe ich es mir noch einmal überlegt.)

――Ist es nur eine Problemstellung? ?? ?? Als ich den Wert tatsächlich in Excel eingegeben habe, wurde Folgendes gefunden

WS000001.JPG

――Es ist langsam, weil es eine vollständige Suche durchführt, also dachte ich noch einmal darüber nach, ob ich den Suchaufwand etwas weiter reduzieren könnte.

Eingabebeispiel: 8 8 3 oooooooo oooooooo oooooooo oooooooo oxoooooo oooooooo oooooxoo oooxoooo

o o o o o o o o
o o o o o o o o
o o o o o o o o
o x o o o o o o
o o o o o o o o
o o o o o x o o
o o o x o o o o

--K = 3, daher darf x nicht innerhalb von 3 von der Mitte entfernt sein ――Es ist auch NG, die Mauer zu überqueren

2 2 2 2 2 2 2 2
2 0 0 0 0 0 0 2
2 0 0 0 0 0 0 2
2 0 0 0 0 0 0 2
2 3 0 0 0 0 0 2
2 0 0 0 0 0 0 2
2 0 0 0 0 3 0 2
2 2 2 3 2 2 2 2

―― Danach geben Sie einen Wert in die Peripherie ein und zählen die verbleibenden 0 ――Wenn Sie die Positionen 1, 2 und 3 zentrieren, ragt die Wand heraus oder verfängt sich in ×

2 2 2 2 2 2 2 2
2 1 1 1 1 1 1 2
2 1 0 0 0 0 1 2
2 2 1 0 0 0 1 2
2 3 2 1 0 1 1 2
2 2 1 1 1 2 1 2
2 1 1 2 2 3 2 2
2 2 2 3 2 2 2 2

--Markierungen, wenn TLE behoben ist --TLE wurde behoben, als "Fortfahren" bei der erneuten Suche in der Umgebung auf "Unterbrechen" gesetzt wurde (der Ort ist kommentiert). ――Ich erkannte, dass ich überlegen musste, wie ich die Suche richtig stoppen kann, anstatt fortzufahren.

	private void solveC() {
		int r = nextInt();
		int c = nextInt();
		int k = nextInt();

		int[][] dist = new int[r][c];
		for (int i = 0; i < r; i++) {
			char[] wk = next().toCharArray();
			for (int j = 0; j < c; j++) {
				/*
				 *Da X eine Landmine ist, ist max und alles andere 0
				 */
				if (wk[j] == 'x') {
					dist[i][j] = k;
				} else if (i == 0 || i == r - 1 || j == 0 || j == c - 1) {
					/*
					 *Füllen Sie den neben der Wand
					 */
					dist[i][j] = k - 1;
				} else {
					dist[i][j] = 0;
				}
			}
		}
		/*
		 *Aktualisieren Sie den numerischen Wert jedes Ortes und überprüfen Sie die Sicherheitszone
		 */
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				/*
				 *Wenn Sie 0 sind, können Sie nicht an andere verteilen
				 *sicherer Bereich
				 */
				if (dist[i][j] == 0) {
					continue;
				}
				allocateNum(r, c, dist, i, j);
			}
		}
		long res = 0;
		/*
		 *Zählen Sie die Anzahl der sicheren Zonen
		 */
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if (dist[i][j] == 0) {
					res++;
				}
			}
		}
		out.println(res);

	}

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

	private void allocateNum(int r, int c, int[][] dist, int i, int j) {
		/*
		 *Verteilen Sie Ihren Wert in alle Richtungen
		 *Wenn es jedoch bereits einen Wert gibt, der größer ist als der Wert, der aus Ihrem eigenen Wert und Ihrer Entfernung berechnet wurde, ignorieren Sie ihn
		 *Wenn Sie in alle Richtungen verteilen, müssen Sie es bis zu Ihrem eigenen Wert verteilen, also doppelte Schleife
		 */
		int base = dist[i][j];
		for (int d4 = 0; d4 < 4; d4++) {
			for (int dLen = 1; dLen <= base; dLen++) {
				int wX = i + dx[d4] * dLen;
				int wY = j + dy[d4] * dLen;

				if (wX < 0 || r <= wX || wY < 0 || c <= wY || dist[wX][wY] >= base - dLen) {
					/*
					 *Behoben, weiterhin zu brechen (TLE wurde durch diesen Fix behoben)
					 *Da wir von einem Ort in der Nähe des Zentrums aus schauen, besteht keine Notwendigkeit, mehr zuzuweisen, wenn das Ziel einen großen Wert aufweist
					 */
					//					continue;
					break;
				}
				/*
				 *Mit zunehmender Entfernung verringert sich der Zuordnungsbetrag um dLen.
				 */
				dist[wX][wY] = base - dLen;
				//Ich habe den Wert aktualisiert, damit ich ihn wieder verteilen kann
				allocateNum(r, c, dist, wX, wY);
			}
		}
	}

C-Rhombus-Zählung: In der Erklärung beschriebene Methode (kumulative Summe?)

4 5 2 xoooo oooox ooooo oxxoo

UP Seitenzahl

0 1 1 1 1
1 2 2 2 0
2 3 3 3 1
3 0 0 4 2

DOWN Seitenzahl

0 3 3 4 1
3 2 2 3 0
2 1 1 2 2
1 0 0 1 1
	private void solveC() {
		int r = nextInt();
		int c = nextInt();
		int k = nextInt();

		char[][] wk = new char[r][c];
		for (int i = 0; i < r; i++) {
			wk[i] = next().toCharArray();
		}
		int[][] up = new int[r][c];
		int[][] down = new int[r][c];

		for (int i = 0; i < c; i++) {
			int uCnt = 0;
			int dCnt = 0;
			for (int j = 0; j < r; j++) {
				if (wk[j][i] == 'o') {
					uCnt++;
				} else {
					uCnt = 0;
				}
				if (wk[r - 1 - j][i] == 'o') {
					dCnt++;
				} else {
					dCnt = 0;
				}
				up[j][i] = uCnt;
				down[r - 1 - j][i] = dCnt;
			}
		}

		long res = 0;
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				/*
				 *Zentrum bestätigt
				 *Wenn es jedoch in beiden vertikalen Richtungen kleiner als k ist, kann es nicht das Zentrum sein.
				 */
				if (up[i][j] < k || down[i][j] < k) {
					continue;
				}
				boolean canCnt = true;
				/*
				 *Erweitern Sie Ihre Suche nach links und rechts
				 */
				for (int l = 1; l < k; l++) {
					/*
					 *c ist+Suche in Richtung
					 * up/Beide Daunen erfüllen den numerischen Wert
					 */
					if (j + l >= c || up[i][j + l] < k - l || down[i][j + l] < k - l) {
						canCnt = false;
						break;
					}
					/*
					 *c ist-Suche in Richtung
					 * up/Beide Daunen erfüllen den numerischen Wert
					 */
					if (j - l < 0 || up[i][j - l] < k - l || down[i][j - l] < k - l) {
						canCnt = false;
						break;
					}
				}
				if (canCnt) {
					res++;
				}
			}
		}
		out.println(res);
	}

C-Rhombus-Anzahl: Normale Schleife (TLE)

	private void solveC2() {
		int r = nextInt();
		int c = nextInt();
		int k = nextInt();

		char[][] wk = new char[r][c];
		for (int i = 0; i < wk.length; i++) {
			wk[i] = next().toCharArray();
		}
		long res = 0;
		/*
		 *Sowohl X-Achse als auch Y-Achse(k-1)Ist notwendig, also subtrahieren Sie diesen Betrag vom Anfang und Ende
		 */
		for (int i = k - 1; i < r - (k - 1); i++) {
			for (int j = k - 1; j < c - (k - 1); j++) {

				if (chkBlack(wk, k, i, j, r, c)) {
					res++;
				}

			}
		}

		out.println(res);
	}

	private boolean chkBlack(char[][] wk, int k, int i, int j, int r, int c) {

		/*
		 *Die linke und rechte Schwungbreite beträgt k-1
		 */
		int wkK = k - 1;
		/*
		 *X-Achse
		 * -(k-1) - 0 - (k-1)
		 */
		for (int i2 = -wkK; i2 <= wkK; i2++) {
			/*
			 *Y-Achse
			 * -(k-1)
			 *  -
			 *  0
			 *  -
			 * (k-1)
			 */
			for (int j2 = -wkK; j2 <= wkK; j2++) {
				int x = i + i2;
				int y = j + j2;
				/*
				 *Grenzen Sie den Suchbereich auf einen Diamanten ein
				 */
				if (Math.abs(i2) + Math.abs(j2) > wkK) {
					continue;
				}
				/*
				 *Heraus, wenn es Vorsprung oder Schwarz gibt
				 */
				if (x < 0 || r <= x || y < 0 || c <= y || wk[x][y] == 'x') {
					return false;
				}
			}
		}
		return true;
	}

Recommended Posts

ABC - 013-A & B & C.
ABC - 023 - A & B & C.
ABC - 036-A & B & C.
ABC - 010 - A & B & C.
ABC - 015 - A & B & C.
ABC - 128 - A & B & C.
ABC - 012-A & B & C.
ABC - 018 - A & B & C.
ABC - 054 - 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 & B & 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 - 131 - A & B & C & D & E.
diverta 2019 Programmierwettbewerb A & B & C & D.
AtCoder Anfängerwettbewerb 169 A, B, C mit Rubin
atcoder ABC113 C Problem
ABC093 C - Gleiche Ganzzahlen
atcoder ABC115 C Problem
AtCoder Anfängerwettbewerb 170 A, B, C bis Rubin
Eine Person, die C ++ schreibt, hat versucht, Java zu schreiben
Machen Sie einen SOAP-Aufruf in C #
Rufen Sie C-Sprachfunktionen von Swift aus auf
NLP4J 100 Sprachverarbeitungsklopfen mit NLP4J # 34 "A B"