第一行输入一个整数.表示有
组测试数据.
每组数据,第一行输入一个整数.表示人数.
接下来一行输入个整数
,表示第
个人的体重是
.
每组测试数据输出一个答案.
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); } }