• 马拉松接力赛(贪心)题解(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 %d %d %d %d %d ",ans,c[1],c[2],c[3],c[4],c[5]);
        return 0;
    }

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

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

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

  • 相关阅读:
    谈谈.Net中的协变和逆变(转)
    如何转移 mysql 数据库,更换服务器之后mysql如何还原
    华盾服务器管理专家,WEB后台密码忘记了,恢复默认初始密码
    合理设置应用程序池 保证网站合理运行
    2012年4月QQ企业邮箱收费后最新版图文教程开通QQ企业邮箱
    word的加密
    在IE下FLASH背景透明而在FF下不透明的解决方法
    当重装数系统/数据库之后,如何恢复数据库的账号 登录名/用户名 孤立用户 缩小ldf日志文件 修改sqlserver2000端口
    ISAPI_Rewrite的安装配置以及加载未知的原因/和无法使用的原因
    网站建设的功能模块说明
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10140727.html
Copyright © 2020-2023  润新知