POJ_1700(过河问题)
程序员文章站
2022-03-26 16:51:59
...
POJ_1700(过河问题)
题目大意
有N个人要渡河,但是只有一艘船,船上每次最多只能载两个人,渡河的速度由两个人中较慢的那个决定,小船来回载人直到所有人都渡河,求最短的渡河时间。
输入的第一行包含一个整数T(1<=T<=20),即测试用例的数量。接下来是T例。每种情况的第一行包含N,第二行包含N个整数,表示每个人过河的时间。每个案例前面都有一个空行。不会有超过1000人,没有人会花超过100秒的时间穿越。
对于每个测试用例,打印一行,其中包含所有N个人过河所需的总秒数。
思路图解
package LanQiao;
import java.util.Arrays;
import java.util.Scanner;
import static java.lang.Math.min;
public class POJ1700 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int i = 0; i < T; i++) {
int n = sc.nextInt();
int[] speed = new int[n];
for (int j = 0; j < n; j++) {
speed[j] = sc.nextInt();
}
//排序
Arrays.sort(speed);
f(n, speed);
}
}
/**
* speed已经排序
* @param n
* @param speed
*/
private static void f(int n, int[] speed) {
int left = n;
int ans = 0;
while (left > 0) {
if (left == 1) {//只有1人
ans += speed[0];
break;
} else if (left == 2) {//只有两人
ans += speed[1];
break;
} else if (left == 3) {//有三人 0 2过河 0回程 0 1过河
ans += speed[2] + speed[0] + speed[1];
break;
} else {
//1,2出发,1返回,最后两名出发,2返回
//0,1过河 0返回;2,3过河 1返回 speed[left - 1]最慢的那个人的速度
int s1 = speed[1] + speed[0] + speed[left - 1] + speed[1];
//1,3出发,1返回,1,4出发,1返回,1,2过河
//0,3过河,0返回;0,2过河,0返回;0,1过河
int s2 = speed[left - 1] + speed[left - 2] + 2 * speed[0];
ans += min(s1, s2);
left -= 2;//左侧是渡河的起点,left代表左侧的剩余人数
}
}
System.out.println(ans);
}
}
运行结果
知识小结
当要求输入多个例子,按照这种方式输入
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int i = 0; i < T; i++) {
int n = sc.nextInt();
int[] speed = new int[n];
for (int j = 0; j < n; j++) {
speed[j] = sc.nextInt();
}
推荐阅读
-
MySQL 8.0.18 Hash Join不支持left/right join左右连接问题
-
解决pyinstaller在单一文件时无法正确添加权限清单问题,(UAC,uac_admin,manifest,asInvoker,python,requireAdministrator)
-
微博发布问题。求大神解决!_html/css_WEB-ITnose
-
关于html网页标注关键字的问题_html/css_WEB-ITnose
-
我在思考一下底层问题
-
关于子网划分,子网掩码出现奇数的有关问题
-
title显示有关问题
-
CSS控制前台样式在360和chrome的兼容问题,跪求高手帮忙,在线等,,,,,,,_html/css_WEB-ITnose
-
CI 问题 curl
-
关于支付的异步通知有关问题