马拉松接力赛(贪心)题解(1252)

备注:要多思考啊,尽量学以致用啊,贪心 一定要多想想是不是具备无后效性!!

尽量开拓思路啊!!!

题目描述

某城市冬季举办环城25km马拉松接力赛,每个代表队有5人参加比赛,比赛要求每个的每名参赛选手只能跑一次,一次至少跑1km、最多只能跑10km,而且每个选手所跑的公里数必须为整数,即接力的地方在整公里处。

刘老师作为学校代表队的教练,精心选择了5名长跑能手,进行了训练和测试,得到了这5名选手尽力连续跑1km、2km、…、10km的所用时间。现在他要进行一个合理的安排,让每个选手跑合适的公里数,使学校代表队跑完25km所用的时间最短。根据队员的情况,这个最短的时间是惟一的,但安排方案可能并不惟一。

根据测试情况及一般运动员的情况得知,连续跑1km要比连续跑2km速度快,连续跑2km又要比连续跑3km速度快……也就是说连续跑的路程越长,速度越慢,当然也有特殊的,就是速度不会变慢,但是绝不可能变快。

输入输出格式

输入格式:

5行数据,分别是1到5号队员的测试数据,每行的10个整数,表示某一个运动员尽力连续跑1km、2km、…、10km所用的时间。

输出格式:

扫描二维码关注公众号,回复: 4560863 查看本文章

两行,第一行是最短的时间,第二行是五个数据,分别是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;
}

比较 每一个千米 哪个人跑的快 跑的快的(还没有超出规定线的)跑

最后累计 每个人跑多少就可以了

至于 无效性嘛———每个人跑了多少米 不会影响到他后面的速度 因为 每个人的每个速度都是在输入的时候给好的 是固定不变 这里用到的贪心 也正好符合了无效性

猜你喜欢

转载自www.cnblogs.com/darlingroot/p/10140727.html
今日推荐