貪心法解登山機器人問題
描述
登山機器人是一個極富挑戰性的高技術密集型科學研究專案,它為研究發展多智慧體系統和多機器人之間的合作與對抗提供了生動的研究模型。登山機器人可以攜帶有限的能量。在登山過程中,登山機器人需要消耗一定能量,連續攀登的路程越長,其攀登的速度就越慢。在對n 種不同型別的機器人作效能測試時,測定出每個機器人連續攀登1米,2米,…,k 米,所用的時間。現在要對這n個機器人作綜合性能測試,舉行機器人接力攀登演習。攀登的總高度為m米。規定每個機器人只能攀登1次,每次至少攀登1 米,最多攀登k 米,而且每個機器人攀登的高度必須是整數,即只能在整米處接力。安排每個機器人攀登適當的高度,使完成接力攀登用的時間最短。
給定n 個登山機器人接力攀登的總高度m,及每個機器人連續攀登1 米,2 米,…,k米,所用的時間,程式設計計算最優攀登方案。
輸入
第一行是正整數n,k和m分別表示機器人的個數,每個機器人最多可以攀登的高度,和攀登的總高度。接下來的n行中,每行有k 個正整數,分別表示機器人連續攀登1米,2米,…,k 米所用的時間。
輸出
將計算出的最短攀登時間輸出。
樣例輸入
5 10 25
24 49 75 102 130 160 192 230 270 320
23 48 75 103 139 181 224 274 344 415
22 49 80 180 280 380 480 580 680 780
25 51 80 120 170 220 270 320 370 420
23 49 79 118 158 200 250 300 350 400
樣例輸出
727
思路: 可以這樣思考,假設每個機器人每次只能走一米。
假設第i個機器人走第j米需要時間 b[i][j], ke,可用w[i]作為標記矩陣, 記錄第i個機器人已經走到第幾米。
採用貪心演算法,每一米都使用時間最少的機器人,然後更新機器人的步數資訊。(僅當此題目表明機器人越走越慢時,此貪心策略有效)
程式碼
void compute()
{
int n,k,m,i,j,min,h,sum=0;
int a[200][200], b[200][200],w[200];
cin>>n>>k>>m;
for(i=1;i<=n;i++)
for(j=1;j<=k;j++)
cin>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<k;j++)
b[i][j]=a[i][j+1]-a[i][j];
for(i=1;i<=n;i++)
b[i][k]=1000000000;
for(i=1;i<=n;i++)
w[i]=1;
for(i=n+1;i<=m;i++){
min=b[1][w[1]];
for(j=1;j<=n;j++)
if(b[j][w[j]]<=min){
min=b[j][w[j]];
h=j;
}
w[h]++;
}
for(i=1;i<=n;i++)
sum+=a[i][w[i]];
cout<<sum<<endl;
}