[JAVA] diverta 2019 Programmierwettbewerb A & B & C & D.

diverta 2019 Programming Contest A&B&C&D diverta 2019 Programming Contest

[Kommentarübertragung: Diverta 2019 Programmwettbewerb Kommentarübertragung]

――Seit Sie nach E nicht mehr in die Hände bekommen können, einmal bis D.

Ein Problem

Beispiel: N = 6, k = 2

$ N-K + 1 $ Paar

1 2 3 4 5 6
1. Satz 1 2
2. Satz 2 3
3. Gruppe 3 4
4. Gruppe 4 5
5. Gruppe 5 6
	private void solveA() {
		int numN = nextInt();
		int numK = nextInt();

		out.println(numN - numK + 1);
	}

--Hinweis: Warum haben Sie das eingereicht?

		long res = 0;
		for (int i = 0; i < numN - numK + 1; i++) {
			res++;
		}
		out.println(res);

B Problem

	private void solveB() {
		int r = nextInt();
		int g = nextInt();
		int b = nextInt();
		int n = nextInt();

		long res = 0;
		for (int i = 0; i <= n; i++) {
			for (int j = 0; j <= n; j++) {
				int wk = i * r + j * g;
				if ((n - wk) >= 0 && (n - wk) % b == 0) {
					res++;
				}
			}
		}

		out.println(res);
	}

C Problem: Rekursive Version

--Klassifizieren Sie Zeichenfolgen

  1. Zählen Sie vorerst, ob AB im Eingabezeichen enthalten ist
  2. Denken Sie an eine Zeichenfolge mit einem ersten B und einem letzten A.
  3. B XXXX A und B XXXX
  4. XXXX A und B XXXX A.
  5. XXXX A und B XXXX
  6. B XXXX A und B XXXX A.
  7. Inhalt der Kombination
  8. B XXXX A und B XXXX-> Muster B kann durch Kombinieren von Muster A und Muster B erstellt werden.
  9. Mit dieser Kombination wird nur Muster A verbraucht
  10. XXXX A und B XXXX A-> Muster C kann durch Kombinieren von Muster C und Muster A erstellt werden.
  11. In dieser Kombination wird nur Muster A verbraucht
  12. XXXX A und B XXXX-> Verschwinden, wenn Muster B und Muster C kombiniert werden
  13. Diese Kombination verbraucht Muster B und Muster C.
  14. B XXXX A und B XXXX A-> Durch Kombinieren von Muster A und Muster A wird Muster A erzeugt
  15. Verbrauchen Sie ein Muster A.
  16. Die Kombinationsmethode kann oben durchgeführt werden, wobei jedoch nur die Verbrauchsmethode von Muster A zu beachten ist.
  17. Muster A kann kombiniert werden, wenn zwei oder mehr vorhanden sind, kann jedoch nicht kombiniert werden, wenn eines vorhanden ist
  18. Wenn die Zeichenfolge nur Muster A enthält (keine Muster B und C), kann das letzte nicht aufgebraucht werden.
  19. Wenn jedoch ein oder mehrere Muster B oder C vorhanden sind, sind die folgenden Kombinationen möglich, sodass das letzte aufgebraucht werden kann.
  20. Muster C + Muster A + Muster B (XXXX A + B XXX A + B XXX)
  21. Muster C + Muster A (XXXX A + B XXX A)
  22. Muster A + Muster B (B XXX A + B XXX)

――Während des Wettbewerbs fiel mir kein Fall ein und ich löste ihn rekursiv.

	private void solveC() {
		int numN = nextInt();
		String[] wk = new String[numN];
		long res = 0;
		int patternA = 0;
		int patternB = 0;
		int patternC = 0;
		for (int i = 0; i < wk.length; i++) {
			wk[i] = next();
			if (wk[i].charAt(0) == 'B' && wk[i].charAt(wk[i].length() - 1) == 'A') {
				patternA++;
			} else if (wk[i].charAt(0) == 'B' && wk[i].charAt(wk[i].length() - 1) != 'A') {
				patternB++;
			} else if (wk[i].charAt(0) != 'B' && wk[i].charAt(wk[i].length() - 1) == 'A') {
				patternC++;
			}
			String[] resA = wk[i].split("AB");
			res += resA.length - 1;
		}

		/*
		 *Zuerst durch rekursive gelöst
		 * [][][]Ich habe versucht, ein Memo zu erstellen, bin jedoch zu Map gewechselt, da möglicherweise OOM auftritt
		 *
		 *Weniger als,[][][]Aber Memocode
		 * int max = Integer.max(Integer.max(patternA, patternB), patternC) + 1;
		 * long[][][] memo = new long[max + 1][max + 1][max + 1];
		 * res += saikiC(patternA, patternB, patternC, 0, memo);
		 */
		Map<String, Long> memo = new HashMap<String, Long>();
		res += saikiC(patternA, patternB, patternC, 0, memo);

		out.println(res);
	}


	/**
	 *
	 * @param a patteernA
	 * @param b patteernB
	 * @param c patteernC
	 * @Parameterpaar B und C bildeten ein Paar oder A und B.,Ich habe ein Paar mit A und C gemacht
	 *Daher das Paar>Wenn 0, kann Muster A bis zum letzten verwendet werden
	 * @param memo
	 * @return
	 */
	//	private long saikiC(int a, int b, int c, int pair, long[][][] memo) {
	private long saikiC(int a, int b, int c, int pair, Map<String, Long> memo) {
		if (a <= 0 && (b <= 0 || c <= 0)) {
			return 0;
		} else if (b <= 0 && a <= 0 && c <= 0) {
			return 0;
		}
		String key = a + ":" + b + ":" + c;
		if (memo.containsKey(key)) {
			return memo.get(key);
		}
		long val1 = 0;
		long val2 = 0;
		long val3 = 0;

		if (b > 0 && c > 0) {
			val1 = saikiC(a, b - 1, c - 1, pair + 1, memo) + 1;
		} else if (a > 1 || (a > 0 && pair > 0)) {
			/*
			 * [Kein Paar=Besteht nur aus a]Wenn a nicht bis zum Ende verwendet werden kann
			 *Jedoch,[pair>0=Da b und c oder a und b, a und c kombiniert sind, gibt es ein Ziel für a]Wenn Sie es bis zum Ende verwenden können
			 */
			val2 = saikiC(a - 1, b, c, pair, memo) + 1;
		} else if (a > 0 && (b > 0 || c > 0)) {
			val3 = saikiC(a - 1, b, c, pair + 1, memo) + 1;
		}
		long res = Long.max(val1, Long.max(val2, val3));
		memo.put(key, res);
		return res;
		//		return memo[a][b][c] = Long.max(val1, Long.max(val2, val3));
		//		return Long.max(val1, Long.max(val2, val3));
	}

Problem C: Einfache Fallklassifizierung (Ergebnis des Lesens und Organisierens der Lösung)

――Wenn Sie die Inhalte organisieren, die durch die obige Wiederholung erstellt wurden, wird dies um so viel verkürzt. .. ..

	private void solveC() {
		int numN = nextInt();
		String[] wk = new String[numN];
		long res = 0;
		int patternA = 0;
		int patternB = 0;
		int patternC = 0;
		for (int i = 0; i < wk.length; i++) {
			wk[i] = next();
			if (wk[i].charAt(0) == 'B' && wk[i].charAt(wk[i].length() - 1) == 'A') {
				patternA++;
			} else if (wk[i].charAt(0) == 'B' && wk[i].charAt(wk[i].length() - 1) != 'A') {
				patternB++;
			} else if (wk[i].charAt(0) != 'B' && wk[i].charAt(wk[i].length() - 1) == 'A') {
				patternC++;
			}
			String[] resA = wk[i].split("AB");
			res += resA.length - 1;
		}

		/*
		 *Ich konnte nur von Fall zu Fall gehen
		 */
		if (patternA == 0) {
			res += Long.min(patternB, patternC);
		} else if (patternA > 0 && (patternB > 0 || patternC > 0)) {
			res += patternA + Long.min(patternB, patternC);
		} else if (patternA > 0 && (patternB == 0 && patternC == 0)) {
			res += patternA - 1;
		}

		out.println(res);
	}

D Problem

--Listen Sie die Brüche von N auf und überprüfen Sie, ob $ n = k ((Bruchteil von N-1) + 1) $ gilt.

	/*
	 * 
	 * n = m*k+k
	 *   = k(m+1)
	 *
	 * (m+1)Wenn ein Bruchteil von N ist, dann ist k*(m+1)Ist ein Vielfaches von N.
	 *   -> m=Ungefähr von N.-Wenn 1,(m+1)はUngefähr von N.になる
	 *
	 */
	private void solveD() {
		long numN = nextLong();

		if (numN < 2) {
			out.println(0);
			return;
		}

		/*
		 *Liste von ungefähr
		 */
		long max = (long) Math.sqrt(numN);
		List<Long> wk = LongStream.range(1, max + 1).collect(() -> new ArrayList<Long>(), (t, i) -> {
			if (numN % i == 0) {
				t.add(i);
				if (i != numN / i) {
					t.add(numN / i);
				}
				//				if (i * i != numN && i <= numN / 2) {
				//					wk.add(numN / i);
				//				}
			}
		}, (t, u) -> {
			t.addAll(u);
		});

		/*
		 *Divisor-Nehmen Sie 1 heraus und beurteilen Sie Folgendes
		 * floor(n/Divisor-1) == n % Divisor-1)
		 */
		long res = wk.stream().reduce(0L, (sum, i) -> {
			long tmp = i - 1;
			if (tmp > 0 && numN / tmp == numN % tmp) {
				sum += tmp;
			}
			return sum;
		});
		out.println(res);

	}

Problem D: Das möchte ich tun. Obwohl es TLE sein wird.

Die, die ich auf dem Tisch ausprobiert habe WS000000.JPG

	private void solveD2() {
		int numN = nextInt();
		long res = 0;

		for (int i = 1; i < numN; i++) {
			if (numN / i == numN % i) {
				res += i;
			}
		}

		out.println(res);
	}

Recommended Posts

diverta 2019 Programmierwettbewerb A & B & C & D.
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.
ABC - 013-A & B & C.
ABC - 036-A & B & C.
ABC - 010 - A & B & C.
ABC - 028 - A & B & C.
ABC - 015 - A & B & C.
ABC - 128 - A & B & C.
ABC - 012-A & B & 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 - 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 - 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.
AtCoder Anfängerwettbewerb 169 A, B, C mit Rubin
AtCoder Anfängerwettbewerb 170 A, B, C bis Rubin
AtCoder dwango Programmierwettbewerb B zum Lösen in Ruby, Perl und Java B.