void solve() { int universitiesCount = in.readInt(); int maxGrants = in.readInt(); int grantsCount = in.readInt(); double[] profit = new double[grantsCount + 1]; for (int i = 0; i < universitiesCount; i++) { double[] currentProfit = new double[maxGrants + 1]; for (int j = 0; j <= maxGrants; j++) currentProfit[j] = in.readDouble(); for (int j = grantsCount; j >= 0; j--) { for (int k = 0; k <= maxGrants && k <= j; k++) profit[j] = Math.max(profit[j], profit[j - k] + currentProfit[k]); } } out.printf("%.2f\n", profit[grantsCount]); }
void solve() { int n = in.readInt(); int[] x = new int[2 * n]; final int[] y = new int[2 * n]; for (int i = 0; i < n; i++) { x[2 * i] = in.readInt(); x[2 * i + 1] = in.readInt(); y[2 * i] = y[2 * i + 1] = in.readInt(); } Integer[] o = new Integer[2 * n]; for (int i = 0; i < 2 * n; i++) o[i] = i; Arrays.sort(o, new Comparator<Integer>() { public int compare(Integer o1, Integer o2) { return y[o1] - y[o2]; } }); int[][] result = new int[2 * n][2 * n]; for (int[] row : result) Arrays.fill(row, Integer.MIN_VALUE); result[o[0]][o[0]] = 0; result[o[1]][o[1]] = 0; for (int ii = 2; ii < 2 * n; ii++) { int i = o[ii]; int maxIndex = ii - ii % 2; for (int jj = 0; jj < maxIndex; jj++) { for (int kk = 0; kk < maxIndex; kk++) { int j = o[jj]; int k = o[kk]; if (valid(k, j, i, x, y)) { result[i][j] = Math.max(result[i][j], result[k][j] + triangleSquare(i, j, k, x, y)); result[k][i] = Math.max(result[k][i], result[k][j] + triangleSquare(i, j, k, x, y)); } } } } int answer = 0; for (int i = 0; i < 2 * n; i++) { for (int j = 0; j < 2 * n; j++) answer = Math.max(answer, result[i][j]); } out.printf("%.1f\n", answer * .5); }