会场安排问题(贪心算法,Ruby)

本文通过一个具体的例子介绍了如何使用贪心算法解决会议安排问题。详细展示了算法实现过程,并分享了作者在实现过程中遇到的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感觉每一个算法都能要我老命,一个贪心算法又是花了老长时间,浮躁要命啊

方案:每次从剩下未安排的会议中选择具有最早结束时间且不会与已安排的的会议重叠的会议来安排。

先贴代码,也可查看我的GitHub

#_*_ coding:utf-8 _*_

@begin = [1,3,0,5,3,5,6,8,8,2,12]
#结束时间要按升序排列
@end = [4,5,6,7,8,9,10,11,12,13,14]
@ary = Array.new(11,false)
#@result = []

def greedySelector(beginAry,endAry,ary)
  ary[0] = true
  j,i = 0,1
  while i < beginAry.size
    if beginAry[i] >= endAry[j]
      ary[i] = true
      j = i
    else
      ary[i] = false
    end
    i += 1
  end
end

#def greedySelector2(beginAry,endAry)
  ##选出最早结束的回忆,如果有两个同时结束,那可能就很尴尬了
  #i = endAry.index(endAry.min)
  #@result << i  #将第一个会议输出
  #j = 0
  #while j < beginAry.size
    #if j == i
      #j += 1
      #next
    #end
    #if endAry[i] <= beginAry[j]
      #@result << j  #输出符合条件的会议
      #i = j
    #end
    #j += 1
  #end
#end

#puts "使用自己理解的方法,结果如下:"
#greedySelector2(@begin,@end)
#puts @result.join(' ')

puts "参照课本改写的方法,结果如下:"
greedySelector(@begin,@end,@ary)

@ary.each_with_index do |item,index|
  if item
    print "#{index} "
  end
end
puts ""

各位看官,我自己写的等于是全部注释掉了,留着时常警示自己。

我的算法中第一步是找出结束时间中最小的那个会议,然而这并不需要,我是参考的课本,课本上对这个算法的分析有一句写的很清楚,数组是按结束时间升序排列的,所以第1个必然是第一个要开始的会议(不理解的自己想吧,我感觉解释不清,这是选这个方案的必然结果)。所以我走了弯路,我本来的想法是从混乱无序的数组中选出正确的顺序,然而并没有必要。

后来我也想过怎样设计适合无序数组的算法,其实很简单,先排序,然后就想不出了,感觉自己的思路被限制了。

今晚写的有点混乱,大家参考一下代码就好了,写这篇博客只是希望我以后分析问题的时候少些浮躁,仔细一点,不然真的会浪费很多时间,与诸君共勉!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值