Div2 - 250 GogoXBallsAndBinsEasy
My intuition told me very simple solution. But I don't tried to prove it.
Div2 - 1000 GogoXReimuHakurai
Div1 - 500 GogoXMarisaKirisima
Despite the fact that these problems are different (second problem is more common) we can solve them using same approach.
My intuition told me very simple solution. But I don't tried to prove it.
public class GogoXBallsAndBinsEasy {
public int solve(int[] T) {
int ans = 0;
for (int i = 0; i < T.length / 2; ++i) {
ans += T[T.length - 1 - i] - T[i];
}
return ans;
}
}
Div2 - 500, Div1 - 250 GogoXCake
public class GogoXCake {
public String solve(String[] cake, String[] cutter) {
int n = cake.length;
int m = cake[0].length();
int r = cutter.length;
int c = cutter[0].length();
char a[][] = new char[n][m];
for (int i = 0; i < n; ++i) {
a[i] = cake[i].toCharArray();
}
for (int i = 0; i + r <= n; ++i) {
for (int j = 0; j + c <= m; ++j) {
boolean ok = true;
for (int i1 = 0; i1 < r; ++i1) {
for (int j1 = 0; j1 < c; ++j1) {
if (cutter[i1].charAt(j1) != '.') {
continue;
}
if (a[i + i1][j + j1] != '.') {
ok = false;
}
}
}
if (!ok) {
continue;
}
for (int i1 = 0; i1 < r; ++i1) {
for (int j1 = 0; j1 < c; ++j1) {
if (cutter[i1].charAt(j1) == '.') {
a[i + i1][j + j1] = 'X';
}
}
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (a[i][j] == '.') {
return "NO";
}
}
}
return "YES";
}
}
Div2 - 1000 GogoXReimuHakurai
Div1 - 500 GogoXMarisaKirisima
Despite the fact that these problems are different (second problem is more common) we can solve them using same approach.
public class GogoXMarisaKirisima {
public int solve(String[] choices) {
int n = choices.length;
boolean a[][] = new boolean[n][n];
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (i == j) a[i][i] = true;
else a[i][j] = choices[i].charAt(j) == 'Y';
}
}
for (int k = 0; k < n; ++k) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (a[i][k] && a[k][j]) {
a[i][j] = true;
}
}
}
}
if (!a[0][n - 1]) return 0;
int V = 0, E = 0;
boolean use[] = new boolean[n];
for (int i = 0; i < n; ++i) {
use[i] = a[0][i] && a[i][n - 1];
}
for (int i = 0; i < n; ++i) {
if (!use[i]) continue;
++V;
for (int j = 0; j < n; ++j) {
if (!use[j]) continue;
if (choices[i].charAt(j) == 'Y') {
++E;
}
}
}
return E - V + 2;
}
}
Div1 - 1000 GogoXBallsAndBins
import java.util.*;
public class GogoXBallsAndBins {
int need, N;
int[] T;
Map m[][];
static final long MOD = 1000 * 1000 * 1000 + 9;
int rec(int k, int wait, int cum) {
if (k == N) {
if (cum == need && wait == 0) return 1;
return 0;
}
if (m[k][wait].containsKey((Integer)cum))
return (Integer)m[k][wait].get(cum);
long res = rec(k + 1, wait, cum);
long w = wait;
if (wait > 0) {
res += rec(k + 1, wait, cum) * w * 2;
res += rec(k + 1, wait - 1, cum + 2 * T[k]) * w * w;
}
res += rec(k + 1, wait + 1, cum - 2 * T[k]);
res %= MOD;
m[k][wait].put(cum, (int)res);
return (int)res;
}
public int solve(int[] T, int moves) {
this.T = T;
need = 2 * moves;
N = T.length;
m = new Map[N + 1][N + 1];
for (int i = 0; i <= N; ++i) {
for (int j = 0; j <= N; ++j) {
m[i][j] = new HashMap();
}
}
return rec(0, 0, 0);
}
}