当前位置: 代码迷 >> 综合 >> 信息学奥赛一本通 1232:Crossing River(evd)
  详细解决方案

信息学奥赛一本通 1232:Crossing River(evd)

热度:26   发布时间:2024-03-08 15:04:09.0

【题目描述】
几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。
【输入】
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
【输出】
输出t行数据,每行1个数,表示每组过河最少时间。
【输入样例】
1
4
1 2 5 10
【输出样例】
17
【心得】首先要搞明白题意,每次两个人过河,然后回来一个。先把规模最小化(不考虑三个人的)四个人过河,有两种方式,第一种最快的两个先过去,第一快的回来,最慢的两个再过去,第二快的回来,最后最快的两个再过去; 第二种是第一快的依次把其余的送过河,哪种用时少就采用哪种方式。规模大了无非就是重复此过程了。
【AC代码】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
const int M=10000;
using namespace std;
int main()
{
    int t,t1,t2,n,a[M];long long int sum;cin>>t;while(t--){
    cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+1+n);sum=0;for(int i=n;i>1;i--,i--) {
    if(i==3){
    sum=sum+a[1]+a[2]+a[3];break;}if(i==2){
    sum=sum+a[2];break;}t1=a[i]+a[i-1]+2*a[1];t2=a[i]+2*a[2]+a[1];sum=sum+(t1<t2?t1:t2);}cout<<sum<<endl;}return 0;
}