top1编程
← 返回题目
题解

过河问题

1 条题解

  • 0
    @ 2026-7-29 0:19:59
    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
    	int n;
    	cin >> n; // 读取每组数据中的人数
    	int a[n];
    	for (int i = 0; i < n; i++) {
    		cin >> a[i]; // 读取每个人的过河时间
    	}
    	sort(a, a + n); // 将过河时间进行升序排序
    	int z = 0; // 初始化总时间
    	if (n == 1) {
    		z = a[0]; // 如果只有一个人,直接是该人的过河时间
    	} else if (n == 2) {
    		z = a[1]; // 如果有两个人,总时间是两人中较大的时间
    	} else {
    		int k = n - 1; // 从最后一个人开始处理
    		while (k >= 3) {
    			// 计算两种策略的时间
    			int a1 = a[0] + a[0] + a[k] + a[k - 1]; // 第一种策略
    			int a2 = a[1] + a[0] + a[k] + a[1]; // 第二种策略
    			z += min(a1, a2); // 选择时间最少的策略
    			k -= 2; // 每次处理两个人,更新剩下的人员
    		}
    		if (k == 2) {
    			// 处理剩下的三个人
    			z += a[2] + a[1] + a[0];
    		} else if (k == 1) {
    			// 处理剩下的两个人
    			z += a[1];
    		}
    	}
    	cout << z << endl; // 输出每组数据的最小时间
    }
    
    • 1