zoukankan      html  css  js  c++  java
  • poj1700 心得

    本题需注意

    假设:int group[] 在left side, 要到达right side

    1.贪心算法使用在:A:船从right side 返回left side时速度是最快的/次快的

             B:船从left side 到right side,再返回,来回的总时间最短

    2.1从right side 返回left side时速度是最快的/次快的,有两种策略

      1> 最快的(即所用时间t[0])和次快的过河,然后最快的将船划回来,再次慢的和最慢的过河,然后次快的将船划回来.

              即所需时间为:t[0]+2*t[1]+t[n-1]
      2> 最快的和最慢的过河,然后最快的将船划回来,再最快的和次慢的过河,然后最快的将船划回来.

              即所需时间为:2*t[0]+t[n-2]+t[n-1]

    参考博客:http://www.cnblogs.com/yueshuqiao/archive/2011/07/22/2113698.html

    2.2来回的总时间最短:两种策略都计算一遍,然后选出最短时间

    3.个人反思:

      两种策略都想到来着,然而没想到要用两种策略都计算一遍再比较,还是对贪心算法运用的不熟

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    bool cmp(int a,int b)
    {
        return a<b;
    }
    
    int main()
    {
        int m,n,t[1001],i,sum;
        cin>>m;
        while(m--)
        {
            cin>>n;
            sum=0;
            for(i=0;i<n;i++)
                cin>>t[i];
            sort(t,t+n,cmp);
            for(i=n-1;i>2;i-=2)
                if(t[0]+2*t[1]+t[i]>2*t[0]+t[i-1]+t[i])
                    sum+=2*t[0]+t[i-1]+t[i];
                else sum+=t[0]+2*t[1]+t[i];
                if(i==2) sum+=t[0]+t[1]+t[2];
                else if(i==1) sum+=t[1];
                else sum+=t[0];
                cout<<sum<<endl;
        }
        return 0;
    }
  • 相关阅读:
    洛谷 P3040 [USACO12JAN]贝尔分享Bale Share
    洛谷 P1994 有机物燃烧
    洛谷 P3692 [PUB1]夏幻的考试
    洛谷 P2117 小Z的矩阵
    洛谷 P1154 奶牛分厩
    洛谷 P1718 图形复原
    洛谷 P1900 自我数
    洛谷 P1964 【mc生存】卖东西
    洛谷 P1123 取数游戏
    hdu_2844_Coins(多重背包)
  • 原文地址:https://www.cnblogs.com/HackHer/p/6081359.html
Copyright © 2011-2022 走看看