第一行输入一个整数.表示有
组测试数据.
每组数据,第一行输入一个整数.表示人数.
接下来一行输入个整数
,表示第
个人的体重是
.
每组测试数据输出一个答案.
2 4 2 10 12 11 4 2 3 7 8
37 19
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n,t,a[100005];
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
int i,j;
cin>>t;
while(t--)
{
cin>>n;
for(i=1; i<=n; i++)
cin>>a[i];
sort(a+1,a+n+1);
ll ans=0;
while(n>=4)
{
ans+=min(a[1]*2+a[n-1]+a[n],a[1]+2*a[2]+a[n]);
n-=2;
}
if(n==3)
ans+=a[1]+a[2]+a[3];
else if(n==2)
ans+=a[2];
else if(n==1)
ans+=a[1];
cout<<ans<<endl;
}
return 0;
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
while(T-- > 0){
int n = Integer.parseInt(br.readLine());
String[] params = br.readLine().trim().split(" ");
int[] weights = new int[n];
for(int i = 0; i < n; i++) weights[i] = Integer.parseInt(params[i]);
System.out.println(crossRiver(weights));
}
}
private static int crossRiver(int[] weights) {
Arrays.sort(weights);
int n = weights.length;
int totalTime = 0;
while(n >= 4){
/* 1.最轻的每次都将船开回来,每次载一个;
2.最轻的两先过去,最轻的那个开船回来让最重的两个过去,那边轻的再把船开回来
*/
totalTime += Math.min(weights[0]*2 + weights[n - 2] + weights[n - 1],
weights[0] + weights[1]*2 + weights[n - 1]);
n -= 2;
}
// 还剩不到4人
if(n == 3)
totalTime += weights[0] + weights[1] + weights[2];
else
totalTime += weights[1]; // 最轻的两个快速过河
return totalTime;
}
} 当人数小于3的时候, 均仅有一种最优解
当人数大于3的时候, 最重的两个人有两种过河方法:
假设四个人体重为:
方法一: a和d先过河, 然后a再回来接c, 最后a再把船还回来, 此时需要时间
方法二: a和b先过河, 然后a再回来还船, c和d再过河, 最后b把船还回来, 此时需要时间
一直从这两个方法中抉择, 最后到达人数小于3的情况
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define int long long
void slove() {
int n; cin >> n; vector<int> a(n);
for(int &t : a) cin >> t;
sort(a.begin(), a.end());
int l = 0, r = n - 1, ans = 0;
while(r >= 3){
ans += min(a[0] + a[r] + a[0] + a[r - 1], a[0] + a[1] + a[1] + a[r]);
r -= 2;
}
if(r == 2) ans += a[0] + a[1] + a[2];
else if ( r == 1) ans += a[1];
else ans += a[0];
cout << ans << endl;
}
signed main() {
int T; cin >> T; while(T--) slove();
}
T = int(input()) for _ in range(T): n = int(input()) nums = [int(i) for i in input().split()] nums.sort() time_min = 0 while len(nums) >= 4: # 每次送走最重的两个人,按楼主说的比较两种方案的时间较短者 time_min += min(nums[-1] + nums[-2] + nums[0] * 2, nums[0] + nums[1] * 2 + nums[-1]) # 送走之后讲最重的两个***出列表 nums.pop(-1) nums.pop(-1) if len(nums) == 3: time_min += sum(nums) elif len(nums) == 2: time_min += max(nums) print(time_min)
package main
import (
"fmt"
"sort"
)
func main() {
var t int
fmt.Scan(&t)
for i := 0; i < t; i++ {
var n int
fmt.Scan(&n)
nums := make([]int, 0)
for j := 0; j < n; j++ {
var ele int
fmt.Scan(&ele)
nums = append(nums, ele)
}
fmt.Println(guohe(nums, n))
}
}
func guohe(nums []int, n int) int {
ans := 0
sort.Ints(nums)
for n > 3 {
ans += min(nums[n-1]+nums[n-2]+2*nums[0], 2*nums[1]+nums[0]+nums[n-1])
n = n - 2
}
if n == 3 {
ans += nums[2] + nums[0] + nums[1]
}
if n == 2 {
ans += nums[1]
}
if n == 1 {
ans += nums[0]
}
return ans
}
func min(x, y int) int {
if x < y {
return x
}
return y
}
为啥超时了。。。。 if __name__ == "__main__": n = int(input()) for i in range(n): m = int(input()) num = list(map(int,input().split())) num = sorted(num) minTime = 0 i = m - 1 while(i >= 3): minTime += min(2*num[0]+ num[i] + num[i-1] ,num[i]+2*num[1]+num[0]) i -= 2 if i == 2: minTime += num[0] + num[1] + num[2] elif i == 1: minTime += num[1] print(minTime)
#include<bits/stdc++.h>
using namespace std;
int helper(int n, vector<int>& weights){
//先从小到大排序便于贪心
if(n == 0) return 0;
sort(weights.begin(), weights.end());
//贪心,当人数不小于4时,我们可知一定是先让最重的过去是最优,此时最优解有两种情况:
//(1)每次都让最轻的分别把最重和次重的运过去,耗时2 * weights[0] + weights[n - 1] + weights[n - 2]
//(2)第一次先让最轻和次轻过去,最轻回去,最重和次重一起过去,次轻回来,耗时 2*weights[1] + weights[0] + weights[n - 1]
//故每次取两者最小值即可
//可知最后留下来的不是最轻的3个人,就是最轻的2个人
//这时3个人,那就是weights[0] + weights[1] + weights[2];
//这时2个人,那就是weights[1];
//最后特殊情况只有1个人不要忘记
int minTime = 0;
while(n >= 4){
minTime += min(2 * weights[0] + weights[n - 1] + weights[n - 2],
2 * weights[1] + weights[0] + weights[n - 1]);
n -= 2;
}
if(n == 3){
minTime += weights[0] + weights[1] + weights[2];
}
else if(n == 2) minTime += weights[1];
else minTime += weights[0];
return minTime;
}
int main(){
int times;
cin >> times;
while(times-- > 0){
int n;
cin >> n;
vector<int> weights(n);
for(int i = 0; i < n; i++){
cin >> weights[i];
}
cout << helper(n, weights) << endl;
}
}
T=int(input()) for i in range(T): n=int(input()) a=list(map(int,input().split())) if n<3: print(max(a)) continue a.sort() temx=0 for j in range(n): temx=temx+a[j] max1=temx+(n-3)*a[0] max2=temx+2*a[1]-a[n-2]+(n-4)*a[0] if max1<=max2: print(max1) else: print(max2)
#include<iostream>
#include<vector>
#include<algorithm>
int main(){
int n = 0;
std::ios::sync_with_stdio(0),std::cin.tie(0);
std::cin >>n;
for(int i=0;i<n;i++){
int length = 0;
std::vector<int>temp_ans;
std::cin >> length;
for(int i=0;i<length;i++){
int temp = 0;
std::cin>>temp;
temp_ans.push_back(temp);
}
std::sort(temp_ans.begin(),temp_ans.end());
int ans = 0;
while(length>=4){
int plan1 = temp_ans[0]*2 + temp_ans[length-2]+temp_ans[length-1];
int plan2 = temp_ans[0]+temp_ans[1]*2+temp_ans[length-1];
ans += std::min(plan1,plan2);
length-=2;
}
if(length==3){
ans+=temp_ans[0]+temp_ans[1]+temp_ans[2];
}
if(length==2){
ans+=temp_ans[1];
}
if(length==1){
ans+=temp_ans[0];
}
std::cout<< ans << std::endl;
}
} public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 输入组数
int T = in.nextInt();
in.nextLine();
while (T-- > 0) {
// 输入人数
int n = in.nextInt();
in.nextLine();
int[] weights = new int[n];
String[] s = in.nextLine().split(" ");
for (int i = 0; i < n; i++) {
weights[i] = Integer.parseInt(s[i]);
}
Arrays.sort(weights);
int res = 0;
while (n >= 4) {
// 最小的带最大的过去,然后回来
int plantOne = weights[n - 1] + weights[0] * 2 + weights[n - 2];
int plantTwo = weights[1] * 2 + weights[0] + weights[n - 1];
res += Math.min(plantOne, plantTwo);
n -= 2;
}
if (n == 3) {
res += weights[0] + weights[1] + weights[2];
}
if (n == 2) {
res += weights[1];
}
if (n == 1) {
res += weights[0];
}
System.out.println(res);
}
}