Category Archives: Round #105 (Div. 2)

E. Porcelain

DP with loops first you get the max sum for each row when you want to take 0 , 1 ..m cells from it after doing this and filling the Array Max[i][j] (it means that if i am at row i and i want to take j cells from it so the max value is Max[i][j]) i start to traverse over the dp array from top to bottom i see what max value could i take from row i and row i-1 until n row so at cell dp[n-1][m] i will get the max value ever
Thanks to Youssef Salama 🙂

package Round_105;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class five {
	public static void main(String[] args) throws IOException {

		BufferedReader buf = new BufferedReader(
				new InputStreamReader(System.in));
		String[] line = buf.readLine().split(" ");
		int n = Integer.parseInt(line[0]);
		int m = Integer.parseInt(line[1]);
		int[][] dp = new int[n][m + 1];
		int[][] Max = new int[n][m + 1];
		int[] row;
		int[] r = new int[n];
		for (int i = 0; i < n; i++) {
			line = buf.readLine().split(" ");
			int x = Integer.parseInt(line[0]);
			row = new int[x + 1];
			r[i] = x;
			for (int j = 1; j <= x; j++)
				row[j] = Integer.parseInt(line[j]);
			fill(Max, row, m, i);
		}
		for (int i = 0; i <= m; i++)
			dp[0][i] = Max[0][i];
		for (int i = 1; i < n; i++) {
			for (int j = 0; j <= m; j++) {
				for (int z = 0; z <= j && z <= r[i]; z++) {
					dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - z] + Max[i][z]);
				}
			}
		}
		System.out.println(dp[n - 1][m]);
	}

	private static void fill(int[][] Max, int[] row, int m, int i) {
		for (int j = 1; j <= m && j < row.length; j++) {
			for (int k = 0; k < row.length; k++)
				for (int l = 0; l < row.length && l + k <= j; l++)
					if (l + k == j) {
						int sum = 0;
						int b = 1;
						while (b <= k)
							sum += row[b++];
						b = 1;
						while (b <= l)
							sum += row[row.length - (b++)];
						Max[i][j] = Math.max(Max[i][j], sum);
					}
		}

	}
}

D. Bag of mice

package Round_105;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Scanner;

public class four {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int w = sc.nextInt();
		int b = sc.nextInt();
		double[][][] dp = new double[w + 1][b + 1][3];
		for (int i = 0; i <= w; i++)
			for (int j = 0; j <= b; j++)
				Arrays.fill(dp[i][j], -1);
		double prob = find(1, w, b, dp);
		BigDecimal bd = new BigDecimal(prob);
		bd = bd.setScale(9, BigDecimal.ROUND_HALF_UP);
		System.out.println(bd);
	}

	private static double find(int term, double w, double b, double[][][] dp) {
		if (w == 0)
			return 0;
		if (w < 0 || b < 0)
			return 0;
		if (dp[(int) w][(int) b][term] != -1)
			return dp[(int) w][(int) b][term];
		else {
			double prob = 0;
			if (term == 1) {
				prob += w / (w + b);
				prob += (b / (w + b)) * find(2, w, b - 1, dp);
			} else {
				if (w + b > 1) {
					prob += (b / (w + b)) * ((b - 1) / (w + b - 1))
							* find(1, w, b - 2, dp);
					prob += (b / (w + b)) * ((w) / (w + b - 1))
							* find(1, w - 1, b - 1, dp);
				}
			}
			return dp[(int) w][(int) b][term] = prob;
		}
	}
}

B. Escape

package Round_105;

import java.util.Scanner;

public class two {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int vp = sc.nextInt();
		int vd = sc.nextInt();
		int t = sc.nextInt();
		int f = sc.nextInt();
		int c = sc.nextInt();
		double time = c * 1.0 / vp - t;
		int count = 0;
		double dist = vp * t;
		time = (c - dist) / vp;
		while (time > 0) {
			double tdash = dist * 1.0 / (vd - vp);
			if (tdash<0)
			{
				count=0;
				break;
			}
			time -= tdash;
			if (time > 0)
				count++;
			dist += vp * tdash;
			time -= dist / vd + f;
			
			dist += vp * (dist / vd + f);

		}
		
		System.out.println(count);
	}
}

A. Insomnia cure

package Round_105;

import java.util.Scanner;

public class Insomniacure {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int k = sc.nextInt();
		int l = sc.nextInt();
		int m = sc.nextInt();
		int n = sc.nextInt();
		int d = sc.nextInt();
		boolean[] v = new boolean[d + 1];
		for (int i = k; i <= d; i += k)
			v[i] = true;
		for (int i = l; i <= d; i += l)
			v[i] = true;

		for (int i = m; i <= d; i += m)
			v[i] = true;
		for (int i = n; i <= d; i += n)
			v[i] = true;
		int count = 0;
		for (int i = 0; i <= d; i++)
			if (v[i])
				count++;
		System.out.println(count);
	}

}