/** * @author LuckyQ * @create 2021-06-16 20:53 */ publicclassMain{ privatestaticintgetAnswer(int n, int m){ int[] f = newint[n + 1]; f[0] = 1; f[1] = 1; for(int k = 2; k <= n; k++){ // 固定根结点后,根结点占一层,故剩余层数需要-1 int maxLevel = Math.min(k, m) - 1; int i = maxLevel, j = k - 1 - i, ans = 0; if(j > maxLevel){ continue; } while(i > j){ ans += f[i] * f[j]; i--; j++; } ans *= 2; if(i == j){ ans += f[i] * f[i]; } f[k] = ans; } return f[n]; }
publicstaticvoidmain(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); System.out.println(getAnswer(n, m)); } }
对称飞行器
时空限制
时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
题目描述
小强在玩一个走迷宫的游戏,他操控的人物现在位于迷宫的起点,他的目标是尽快的到达终点。 每一次他可以选择花费一个时间单位向上或向下或向左或向右走一格,或是使用自己的对称飞行器花费一个时间单位瞬移到关于当前自己点中心对称的格子,且每一次移动的目的地不能存在障碍物。 具体来说,设当前迷宫有$n$行$m$列,如果当前小强操控的人物位于点$A(x,y)$,那么关于点$A$中心对称的格子$B(x_1,y_1)$满足$x + x_1 = n + 1$且$y + y_1 = m + 1$。 需要注意的是,对称飞行器最多使用5次。
/** * @author LuckyQ * @create 2021-06-16 20:53 */ publicclassMain{ privatestaticdoublegetAnswer(int[] A, int[] B){ int n = A.length; double ans = 0; for(int i = 0; i < n; i++){ for(int j = i + 1; j < n; j++){ double x = (B[i] + B[j]) / 2.0; double y = (A[i] + A[j]) / 2.0; double t = Math.min(x, y); if(t > ans){ ans = t; } } } return ans; }
publicstaticvoidmain(String[] args){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] A = newint[n], B = newint[n]; for(int i = 0; i < n; i++){ int a = scanner.nextInt(); int b = scanner.nextInt(); A[i] = a; B[i] = b; } System.out.println(String.format("%.1f", getAnswer(A, B))); } }