1. 程式人生 > >馬拉松接力賽(貪心)題解(1252)

馬拉松接力賽(貪心)題解(1252)

備註:要多思考啊,儘量學以致用啊,貪心 一定要多想想是不是具備無後效性!!

儘量開拓思路啊!!!

 

題目描述

某城市冬季舉辦環城25km馬拉松接力賽,每個代表隊有5人蔘加比賽,比賽要求每個的每名參賽選手只能跑一次,一次至少跑1km、最多隻能跑10km,而且每個選手所跑的公里數必須為整數,即接力的地方在整公里處。

劉老師作為學校代表隊的教練,精心選擇了5名長跑能手,進行了訓練和測試,得到了這5名選手盡力連續跑1km、2km、…、10km的所用時間。現在他要進行一個合理的安排,讓每個選手跑合適的公里數,使學校代表隊跑完25km所用的時間最短。根據隊員的情況,這個最短的時間是惟一的,但安排方案可能並不惟一。

根據測試情況及一般運動員的情況得知,連續跑1km要比連續跑2km速度快,連續跑2km又要比連續跑3km速度快……也就是說連續跑的路程越長,速度越慢,當然也有特殊的,就是速度不會變慢,但是絕不可能變快。

輸入輸出格式

輸入格式:

 

5行資料,分別是1到5號隊員的測試資料,每行的10個整數,表示某一個運動員盡力連續跑1km、2km、…、10km所用的時間。

 

輸出格式:

 

兩行,第一行是最短的時間,第二行是五個資料,分別是1到5號隊員各自連續跑的公里數

 

#include<cstdio>
using namespace std;
int a[6][11],b[6][11],c[6]={1,1,1,1,1,1},flag,ans,minx; //a陣列是用來輸入讀取的 b陣列是用來記錄計算這五個人每千米的速度 c陣列是用來記錄每個人跑的路程(即千米數)
int main() 
{
 for(int i=1;i<=5;i++)
 {
  for(int j=1;j<=10;j++)
  {
   scanf("%d",&a[i][j]);//輸入a
   b[i][j]=a[i][j]-a[i][j-1];//計算得b
  }
 }
 for(int i=1;i<=20;i++)
 {
        minx = 100000;
        for(int j = 1; j <= 5; j++)
            if(b[j][c[j]+1] < minx && c[j]+1 <= 10)
   {
                flag = j;
                minx = b[j][c[j]+1];
            }
        c[flag]++;//找到這個千米下速度最快的
    }
 for(int i = 1; i <= 5; i++) ans+=a[i][c[i]];
    printf("%d\n%d %d %d %d %d\n",ans,c[1],c[2],c[3],c[4],c[5]);
    return 0;
}

 

比較 每一個千米 哪個人跑的快 跑的快的(還沒有超出規定線的)跑

最後累計 每個人跑多少就可以了

至於 無效性嘛———每個人跑了多少米 不會影響到他後面的速度 因為 每個人的每個速度都是在輸入的時候給好的 是固定不變 這裡用到的貪心 也正好符合了無效性