閱讀1009 返回首頁    go 阿裏雲 go 技術社區[雲棲]


2013藍橋杯【模擬賽】運送馬匹

運送馬匹
  有1個人,要把n匹馬從A村運往B村。
  初始時,人和馬都在A村。每次騎1匹馬牽1匹馬,回來時騎1匹馬。
  已知每匹馬從A村到B村需要的時間(數字越大越慢)
  兩匹馬同行時隻能遷就較慢者。
  求所有馬匹都運到B村的最小的運輸時間(此時,人和馬都在B村)。
  程序首先輸入一個整數n(n<100),表示有n匹馬。
  接著是n行整數,表示馬從A村到B村的所用的分鍾數(小於1000)
  程序輸出:1個整數,表示所有馬匹均運到B村的最小總耗時。
  例如,
輸入:
3
1
2
4
程序應輸出:
7
輸入:
4
1
4
2
5
程序應該輸出:
12
對於編程題目,要求選手給出的解答完全符合ANSI C++標準,不能使用諸如繪圖、Win32API、中斷調用、硬件操作或與操作係統相關的API。
代碼中允許使用STL類庫,但不能使用MFC或ATL等非ANSI c++標準的類庫。例如,不能使用CString類型(屬於MFC類庫)。
所有代碼放在同一個源文件中,調試通過後,拷貝提交該源碼。
注意選擇自己使用的編譯環境。

 


思路:選擇兩匹最快的馬匹來回運送其它的馬匹,最後的最後再將這兩批最快的馬匹運回就完成了
因為用到貪心思想,所以一開始要將馬匹的速度從小到大排序,得到速度最快的前兩個馬匹,之後
運用遞歸的方法來運送馬匹,一回合用最快的馬運送兩個(例如:1,2,5,4,8:排序後:1,2,4,5,8;先用1,2,將1送到目的地,用時a[1],2返回
,用時a[1],之後速度倒數第二的馬匹和速度倒數第一的馬匹一起過去,用的時間是a[n-1](此時B地有馬3匹,分別是1和a[n-2]和a[n-1]),
之後1再回去,用時a[0],一回合的用時就是a[1]*2+a[0]+a[n-1],此時運送了兩匹馬(a[n-2]和a[n-1])),直到運送完畢

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[200],sum=0;
int Fun(int n)
{
    if(n==1)
    sum+=a[0];
    else if(n==2)
    sum+=a[1];
    else if(n==3)
    sum+=a[1]+a[2];
    else
    {
        sum+=2*a[1]+a[0]+a[n-1];//每一回合的式子
        Fun(n-2);//運好兩匹馬之後遞歸   
    }
}
int main()
{
    int i,j,n,m1,m2;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    sort(a,a+n);//排序(從小到大)
    Fun(n);
    printf("%d\n",sum);
    return 0;
}


 

最後更新:2017-04-03 12:55:36

  上一篇:go VxWorks 引導程序
  下一篇:go VxWorks各部分初始化流程