1 条题解

  • 1
    @ 2025-2-23 19:32:51

    题目传送门
    我们可以得出结论:在给定的示例中,最优的过河策略是:

    让过河时间最短的两个人(1和2)一起过河,时间为2分钟。

    让过河时间最短的人(1)返回,时间为1分钟。

    让过河时间最长的两个人(5和10)一起过河,时间为10分钟。

    让过河时间第二短的人(2)返回,时间为2分钟。

    让过河时间最短的两个人(1和2)再次一起过河,时间为2分钟。

    #include<bits/stdc++.h>
    using namespace std;
    const int inff = 1e6;
    long long x, n, c, b[inff], t;
    vector<int>w, clear;
    int water() {
    	int ans=0;
    	sort(w.begin(), w.end());
    	ans = 0;
    	while (n > 3) {
    		// 策略1:最快的两个人先过河,最快的人返回,最慢的两个人过河,第二快的人返回
    		int way1 = w[0] + w[1] * 2 + w[n - 1];
    		// 策略2:最快的和最慢的两个人先过河,最快的人返回,最快的和第二慢的过河,最快的人返回
    		int way2 = w[0] * 2 + w[n - 1] + w[n - 2];
    		ans += min(way1, way2);
    		n -= 2;
    		w.pop_back();
    		w.pop_back();
    	}
    	if (n == 3) {
    		ans += w[0] + w[1] + w[2];
    	} else if (n == 2) {
    		ans += w[1];
    	} else if (n == 1) ans += w[0];
    	return ans;
    }
    int main() {
    	cin >> t;
    	while (t--) {
    		cin >> n;
    		for (int i = 1; i <= n; i++) {
    			cin >> x;
    			w.push_back(x);
    		}
    		cout <<water()<< endl;
    		w = clear;
    	}
    	return 0;
    }
    
    

    信息

    ID
    3653
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    7
    已通过
    1
    上传者