馬拉松接力賽(貪心)題解(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;
}
比較 每一個千米 哪個人跑的快 跑的快的(還沒有超出規定線的)跑
最後累計 每個人跑多少就可以了
至於 無效性嘛———每個人跑了多少米 不會影響到他後面的速度 因為 每個人的每個速度都是在輸入的時候給好的 是固定不變 這裡用到的貪心 也正好符合了無效性