zoukankan      html  css  js  c++  java
  • Crossing River 题解(贪心)

    题目链接

    题目大意

    t组数据(t<=20)

    给你n个人(n<=1000)过河,每个人都有权值,一条船,每次船最多运2个人,每次的花费为两个人的较大花费

    求所有人都过河需要的最小花费

    题目思路

    经典的过河问题,记录一下

    先将权值从小到大排序一下

    每次运两个人显然有两种最优的方法

    1:先运(a[1],a[2])过去,a[1]回来,再运(a[n],a[n-1])过去,a[2]回来

    cost1=a[n]+2*a[2]+a[1]

    2:先运(a[n],a[1])过去,a[1]回来,再运(a[n-1],a[1])过去,a[1]再回来

    cost2=a[n]+a[n-1]+2*a[1]

    然后当n只有三个的时候特判一下即可

    代码

    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    //#include<unordered_map>
    #define fi first
    #define se second
    #define debug printf(" I am here
    ");
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef pair<int,int> pii;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int maxn=1000+5,inf=0x3f3f3f3f,mod=1e9+7;
    const double eps=1e-5;
    int n,a[maxn];
    int main(){
        int _;scanf("%d",&_);
        while(_--){
            scanf("%d",&n);
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
            }
            sort(a+1,a+1+n);
            int ans=0;
            while(n>3){
                ans+=min(a[n]+a[n-1]+2*a[1],a[n]+2*a[2]+a[1]);
                n-=2;
            }
            if(n==1){
                ans+=a[1];
            }else if(n==2){
                ans+=a[2];
            }else{
                ans+=a[1]+a[2]+a[3];
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    
    
  • 相关阅读:
    Java基础-IO流对象之字节流(Stream)
    Java基础-IO流对象之File类
    Java基础-集合的嵌套
    rsync命令的基本使用
    java基础-Map集合
    Java基础-Collection子接口之Set接口
    Java基础-Collection子接口之List接口
    Java基础-泛型
    Unity4.3 bug GetChild顺序错乱
    Windows系统上的.Net版本和.NETFramework的C#版本
  • 原文地址:https://www.cnblogs.com/hunxuewangzi/p/14019397.html
Copyright © 2011-2022 走看看