编程沙龙(15)

IT商界

  上期有奖征答活动中,我们曾经刊出了一位朋友的源代码,并指出了其中的一些问题。下面的这段话是这位朋友给我们的来信:“……通过对这道题的反复修改和论证,我从中学到了新的方法和知识,它的意义远超过了获得奖品。我想,设置这个栏目的初衷本在于此。你说得对,这个栏目是属于大家的,只有广大爱好者积极地参与到这个栏目中去,这个栏目才能得以发展和壮大……”

  看过这封信,我感触很多。这位朋友体会到了我们办“算法演义”和“编程沙龙”的目的:为广大编程爱好者提供一个交流学习的场所。这里不仅要为高手们提供一个自我展示的舞台,也更应该是广大初学者学习的殿堂。当然我们的尝试才刚刚开始,一定会存在各种各样的问题。所以希望大家都能积极地参与到我们的栏目中来,群策群力把这个属于我们自己的栏目办好!谢谢大家了。

  最近,我对朋友们提出的问题进行整理后发现,大部分都是关于在VB中使用特定API的。这里我建议这些朋友可以安装MSDN,因为MSDN里的帮助文档以及范例是非常详实的。如果没有MSDN,可以在网上动态查找。例如http://vbworld.sxnw.gov.cn/vbapi/index.asp、http://www.sijiqing.com/vbgood/apimanual/index.html,也可以选择到网上找个API的资料文档下载下来随时查阅。例如http://vbworld.sxnw.gov.cn/vbapi/vbapi.zip、http://www.xymf.com/vbdak/openfile.asp?softID=78&downurl=download/vbapi.zip。

  本月有奖问答的题目是:

  若由两个人A、B承担N个作业的任务。设第i个作业交给A处理需要的时间为ai,而交给B处理,需要的时间为bi。由于各作业的特点和各人擅长的技能不同的关系,很可能对于某些i,有ai≥bi,而对于某些j,j≠i,有aj<bj。既不能将一个作业分开由两个人处理,也没有一个人能同时处理两个作业。设计一个算法,使得这两个人处理完这N个作业的时间最短(从任何一个人开工到最后一个人完工的总时间)。研究一个实例:(a1,a2,a3,a4,a5,a6,a7)=(2,8,9,11,4,5,7);(b1,b2,b3,b4,b5,b6,b7)=(4,5,12,10,3,4,8)。

  这几天看了读者朋友们参与有奖征答栏目寄来的程序,我发现有些朋友把题目想简单了。解答中有不少朋友采用的方法是依次比较每个作业分别由两个工人来做需要的时间,谁用的时间少就由谁来做该项工作。例如(a1,a2,a3)=(3,10,7);(b1,b2,b3)=(7,11,5)。那么根据上面的方法,有a1<b1,a2<b2,a3>b3,解就应该是(a1,a2,b3)。那么总的用时就是MAX(a1+a2,b3)=13。事实上,如果采取的方案是(a1,b2,a3),那么总的用时是MAX(a1+a3,b2)=11,显然这种方案的结果比前面的用时要短。所以我们可以下结论,前面的方法是有问题的。当然,这种方法在特定的条件下有时也能得到符合要求的解,比方说我们题目中要求研究的那个实例。真是一个巧合,我当时随手编的一组数据居然就这么巧,用上面的方法得到的解刚好就是最佳的解(看来有必要去买买彩票了^_^)。还有一些朋友注意到了上面的问题,所以采取了历遍所有可能的解的方法来解题。这种方法应该说还是可行的,但效率好像不太高。那么究竟怎样做才能够全面、高效地解决本题?且听我们下回分解。