6.3 Minefield

原题

我们先从简单的情况来考虑:
当有两个人的时候, T = m a x ( x 1 , x 2 ) T=max(x_1,x_2) T=max(x1,x2)
当有三个人的时候, T = x 1 + x 2 + x 3 T=x_1+x_2+x_3 T=x1+x2+x3
当有四个人的时候 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1x2x3,x4(已经按照从小到大顺序排好了),我们有两种选择:
第一种是让 x 1 , x 2 x_1,x_2 x1x2先过去, x 1 x_1 x1回来, x 3 , x 4 x_3,x_4 x3,x4过去, x 2 x_2 x2回来,然后 x 1 , x 2 x_1,x_2 x1x2一起过去, T 1 = x 2 + x 1 + x 4 + x 2 + x 2 T_1=x_2+x_1+x_4+x_2+x_2 T1=x2+x1+x4+x2+x2= x 1 + 3 ∗ x 2 + x 4 x_1+3*x_2+x_4 x1+3x2+x4
第二种:
x 1 x_1 x1 x 4 x_4 x4过去,再回来, x 1 x_1 x1 x 3 x_3 x3过去,再回来,再跟 x 2 x_2 x2一起过去, T 2 = x 4 + x 1 + x 3 + x 1 + x 2 T_2=x_4+x_1+x_3+x_1+x_2 T2=x4+x1+x3+x1+x2= 2 ∗ x 1 + x 2 + x 3 + x 4 2*x_1+x_2+x_3+x_4 2x1+x2+x3+x4

因此,我们在解决n个人的时候,我们需要用时间最短的那两个人带后面的人过去, T = m i n ( x 1 + 2 ∗ x 2 + x n , 2 ∗ x 1 + x n − 1 + x n ) T=min(x_1+2*x_2+x_{n},2*x_1+x_{n-1}+x_{n}) T=min(x1+2x2+xn,2x1+xn1+xn);
代码如下:

#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int clo[100+5];
int main()
{
    int num;
    cin>>num;
    for(int i=0;i<num;++i)
        cin>>clo[i];
    sort(clo,clo+num);
    int res=0;
    num--;
    while(num>0)
    {
        if(num==1)
        {
            res+=clo[1];
           // cout<<res<<"----"<<endl;
            break;
        }
        if(num==2)
        {
            res+=clo[0]+clo[1]+clo[2];
            //cout<<res<<"/"<<endl;
            break;
        }
        else
        {
            res+=min(clo[0]+clo[1]*2+clo[num],clo[0]*2+clo[num-1]+clo[num]);
           // cout<<res<<"****"<<endl;
            num-=2;
        }
    }
    cout<<res<<endl;
    
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值