题目链接
- https://www.luogu.com.cn/problem/P1007
题目大意
- 有若干个士兵在长度为L的桥上,现在要求所有士兵从桥上下来花费的最小和最大时间,每次士兵只能向左或向右移动一个单位,桥上的坐标为1, 2, 3, …, L,因此士兵需要移动到0或L+1才算离开桥
解题思路
- 要求所有士兵从桥上下来花费的最小和最大时间
- 全部离开独木桥的最小时间,就是每个士兵都向离桥边短的方向走
- 所有士兵的下桥的最小时间为,每个士兵都采取自己下桥花费最小的方案,即计算从左边走或从右边走的时间花费的较小值,然后从中选取出花费时间最大的士兵的时间,就是所有士兵下桥的最小时间
- 全部士兵下桥的最短时间为每个士兵最小花费(从左边下还是右边下的较小值)的最大值
- 最大时间就是每个士兵都向离桥边远的方向走,此时离桥边最远的那个士兵耗费的时间就是最大时间
- 虽然说,假如有 2 个人相向而行在桥上相遇,那么他们 2 个人将无法绕过对方,只能有 1 个人回头下,让另一个人先通过。
- 但是两个人相遇,回头,可以看成两个人进行了灵魂交换,这样子可以看成两个人都还是按照之前的方向移动
- 注意:士兵需要移动到0或L+1才算离开桥
解题代码
import java.io.*;
public class Main {private static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));private static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));public static void main(String[] args) {int l = readInt();int n = readInt();int max = 0; int min = 0; for (int i = 0; i < n; i++) {int location = readInt();int greaterTime = Math.max(location, l - location + 1);int letterTime = Math.min(location, l - location + 1);max = Math.max(greaterTime, max);min = Math.max(letterTime, min);}out.print((min) + " " + (max));out.flush();}private static int readInt() {int in = Integer.MIN_VALUE;try {st.nextToken();in = (int) st.nval;} catch (IOException e) {e.printStackTrace();}return in;}}