代码拉取完成,页面将自动刷新
这给我难的...
智力题
import java.util.Arrays;
import java.util.Scanner;
public class Main {
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[] a = new int[n];
for (int j = 0; j < n; j++) {
a[j] = sc.nextInt();
}
Arrays.sort(a);
System.out.println(min(a, n - 1));
}
}
public static long min(int[] a, int end) {
if (end + 1 == 1)
return 0;
if (end + 1 <= 2)
return a[1];
if (end + 1 == 3)
return a[2] + a[1] + a[0];
if (a[0] + a[end - 1] > 2 * a[1])
return a[1] * 2 + a[0] + a[end] + min(a, end - 2);
else
return a[end] + a[0] + min(a, end - 2);
}
}
# 容易想到的是过河方案就是最轻的人作为摆渡人,一趟一趟运
# 还有一种是,最轻的人把第二轻的送到对岸,自己回来,再让最重的两个人过去,第二轻的再把船划回来
# 一直比较这两种方案,直到人数小于3
def first():
T = int(input())
for _ in range(T):
n = int(input())
weights = list(map(int, input().split()))
sorted(weights)
res = 0
while n > 3:
res += min(weights[1] * 2 + weights[0] + weights[-1], weights[0] * 2 + weights[-1] + weights[-2])
weights.pop()
weights.pop()
n -=2
if n == 1 or n == 3:
res += sum(weights)
elif n == 2:
res += max(weights)
print(res)
first()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。