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.
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 vereinfacht würde?
Also 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);
}
--Klassifizieren Sie Zeichenfolgen
――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));
}
――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);
}
Lösung PDF und Lieferung sind gut
[Viele Erklärungen, die leicht zu verstehen sind, wenn Sie googeln, weil der Quotient dem Rest entspricht](https://www.google.com/search?q=%E5%95%86%E3%81%A8%E4%BD%99% E3% 82% 8A% E3% 81% 8C% E7% AD% 89% E3% 81% 97% E3% 81% 84 & oq =% E3% 81% 97% E3% 82% 87% E3% 81% 86% E3 % 81% A8% E3% 81% 82% E3% 81% BE% E3% 82% 8A & aqs = chrome.1.69i57j35i39j0l4.7025j0j4 & sourceid = chrome & ie = UTF-8)
Wenn das Ergebnis jedes Ausdrucks K ist, dann ist $ n = m * k + k $
-
Verwandle $ n = m * k + k $ in $ n = k (m + 1) $
$ k * (m + 1) $ ist ein Vielfaches von N.
$ (m + 1) $ ist ein Bruchteil von N.
Das heißt, ein Bruchteil von $ m = N-1 $
--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);
}
Die, die ich auf dem Tisch ausprobiert habe
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