NOIP2006年题解.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一方面,每个操作的安排都要满足以下的两个约束条件。 (1) 对同一个工件,每道工序必须在它前面的工序完成后才能开始; (2) 同一时刻每一台机器至多只能加工一个工件。 ????另一方面,在安排后面的操作时,不能改动前面已安排的操作的工作状态。 ????由于同一工件都是按工序的顺序安排的,因此,只按原顺序给出工件号,仍可得到同样的安排顺序,于是,在输入数据中,我们将这个安排顺序简写为“ 1 1 2 3 3 2 ” 。 ????还要注意,“安排顺序”只要求按照给定的顺序安排每个操作。不一定是各机器上的实际操作顺序。在具体实施时,有可能排在后面的某个操作比前面的某个操作先完成。 ????例如,取 n=3,m=2 ,已知数据如下: 当 一个操作插入到某台机器的某个空档时(机器上最后的尚未安排操作的部分也可以看作一个空档),可以靠前插入,也可以靠后或居中插入。为了使问题简单一些, 我们约定:在保证约束条件( 1 )( 2 )的条件下,尽量靠前插入。并且,我们还约定,如果有多个空档可以插入,就在保证约束条件( 1 )( 2 )的条件下,插入到最前面的一个空档。于是,在这些约定下,上例中的方案一是正确的,而方案二是不正确的。 ????显然,在这些约定下,对于给定的安排顺序,符合该安排顺序的实施方案是唯一的,请你计算出该方案完成全部任务所需的总时间。 【输入文件】 ???? 输入文件 jsp.in 的第 1 行为两个正整数,用一个空格隔开:m n (其中 m ( 20 )表示机器数, n ( 20 )表示工件数) ????第 2 行: 个用空格隔开的数,为给定的安排顺序。 ????接下来的 2n 行,每行都是用空格隔开的 m 个正整数,每个数不超过 20 。 ????其中前 n 行依次表示每个工件的每个工序所使用的机器号,第 1 个数为第 1 个工序的机器号,第 2 个数为第 2 个工序机器号,等等。 ????后 n 行依次表示每个工件的每个工序的加工时间。 ????可以保证,以上各数据都是正确的,不必检验。 【输出文件】 ????输出文件 jsp.out 只有 一个正整数,为最少的加工时间。 【输入输出样例】 jsp.in 2 3 1 1 2 3 3 2 1 2 1 2 2 1 3 2 2 5 2 4 jsp.out 10 分析: NOIp2006中最简单的一道题,只要简单地模拟一下就可以了。对于这道题关键在于仔细阅读题目,题目变态地长!细心再细心! 我们用一个[1..20,0..10000]的布尔数组d,d[i,j]表示第i个机器的第j个时间是否被使用。用一个[1..20]的整形数组counter,counter[i]表示第i个工件该进行哪一个工序。用一个[1..20]的整形数组last,last[i]表示第i个工件的工序该从哪个时间点开始。 从题目给定的插入顺序依次对d进行改动。 用last[i]记录第i个工件目前为止需要的时间,后面的工序在此基础上添加就可以了。最后扫描一遍last[i]数组,最大的那个即为最终答案。 时间 1 2 3 4 5 6 7 8 9 10 第一台机器 0 0 0 0 0 0 0 0 0 0 第二台机器 0 0 0 0 0 0 0 0 0 0 时间 1 2 3 4 5 6 7 8 9 10 第一台机器 1 (1-1) 1 (1-1) 1 (1-1) 1 (2-1) 1 (2-1) 1 (3-2) 1 (3-2) 1 (3-2) 1 (3-2) 0 第二台机器 1 (3-1) 1 (3-1) 0 1 (1-2) 1 (1-2) 1 (2-2) 1 (2-2) 1 (2-2) 1 (2-2) 1 (2-2) int m,n,order[450],num[21][21],tim[21][21]; int ans,d[21][450],last[21],counter[21]; //ans为最佳时间,d[i][j]记录在第i个机器上第j分钟是否被占用,last[i]记录第i个工件目前为止需要的时间,counter[i]记录第i个工件该做第几个工序 int ok(int nn,int ss,int begin)//第nn个工件的第ss 个工序可以在begin时间加工 { int i,tmp=num[nn][ss];//在第tmp个机器上加 工 for(i=begin;i=begin+tim[nn][ss]-1;i++)//扫描第nn个工件在tmp个机器上加工所需的时间从begin开始是否被占用 if(

文档评论(0)

此项为空 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档