Crossing River(贪心算法)

只有一艘船,能乘2人,船的运行速度为2人中较慢一人的速度,过去后还需一个人把船划回来,问把n个人运到对岸,最少需要多久。
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
输出t行数据,每行1个数,表示每组过河最少时间。
思路:
由于运送人数,每人过河所用时间差的大小等因素在每个测试样例中不同,所以本题有两种较优方案
1.最快的和次快的过河,然后最快的将船划回来;次慢的和最慢的过河,然后次快的将船划回来,时间:t[0]+2t[1]+t[n-1];(最快和次快过了河一定再让最慢次慢过河,如果n为奇数要让单着的人尽可能用时少)
2.最快的和最慢的过河,然后最快的将船划回来,最快的和次慢的过河,然后最快的将船划回来(每一次都让最快的将船划回来)时间:2
t[0]+t[n-2]+t[n-1]。
一开始我用了递归的方法去计算方案中的时间t1但是空间复杂度太高,出现了Memory Limit Exceeded(内存超限)的错误
t2比较好求一个循环就可以解决
下面是我第一次写的代码(Memroy limit Exceeded)

#include
#include
using namespace std;
int f(int n,int a[]) //递归的思想
{
    int sum=0;
    if(n==2)
        return a[2];
    if(n==3)
        return a[1]+a[2]+a[3];
    if(n%2==0)      //分奇偶讨论
    {
        for(int i=1;i<=n/2;i++)
    {
        sum=sum+a[2*i]+a[i];
    }
    f(n/2,a);
    }
    for(int i=1;i<=(n-1)/2;i++)
    {
        sum=sum+a[2*i]+a[i];
    }
    a[(n-1)/2+1]=a[n];
    f((n-1)/2+1,a);
    return sum;
}
int main()
{
    int t,n,time[1002],sum1=0,sum2=0;
    cin>>t;
    for(int ii=0;ii>n;
     for(int i=1;i<=n;i++)
    {
        cin>>time[i];
        sum1+=time[i];
    }
    for(int i=0;itime[j+1])
        swap(time[j],time[j+1]);
     sum1+=(n-3)*time[1];
     sum2=f(n,time)-1;
    }
    cout<

改了一下思路还是Wrong Answer

#include
#include
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n,sum=0,sum1=0,sum2=0,time[1005],fast1,fast2,slow3,slow4; //最快的两个和最慢的两个
        cin>>n;
        for(int i=0;i>time[i];
             sum1+=time[i];
           }
            for(int i=0;itime[j+1])
                swap(time[j],time[j+1]);
        if(n<=2){
            cout<=3;i-=2)
               {
                sum1=time[1]+time[0]+time[i]+time[1];
                sum2=time[0]+time[i]+time[0]+time[i-1];
                sum=min(sum1,sum2);
               }
                if(i==1)
               sum+=time[1];
            else
                sum+=time[0]+time[1]+time[2];
            }
        cout<

但实际上一但推出两种方案的时间表达式,代码就可以简化的很简单了

我看到的一个更简单的代码

#include
#include
#include
#include
#include
#define INF 999999999
#define N 1001
using namespace std;
int a[N],dp[N];
int main()
{
    int t;
    int n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=0;i>a[i];
        sort(a,a+n);
        dp[0]=a[0];
        dp[1]=a[1];
        for(int i=2;i

你可能感兴趣的:(贪心算法,c++)