【发布时间】:2016-09-23 12:37:24
【问题描述】:
我已经实现了一个简短的算法来判断是否所有酒店预订都是可能的。问题和this很像,不过我尝试过实现自己的逻辑。
(很抱歉这么长的解释)
在我的算法中
-
intK= 可用房间数 -
ArrayList<Integer>到达=客人到达时间 -
ArrayList<Integer>leave = 客人出发时间 -
intaving_guest = 下一位客人 -
ArrayList<ArrayList<Integer>>arrange = 房间分配
例如
- 到达 = [1,3,5]
- 出发 = [2,6,8] 和
- K=1
现在在我们开始迭代之前,ArrayList<ArrayList<Integer>> arrange 将是 [[2]],因为最初所有房间都可用,int arriving_guest = 1 作为第一个客人入住,它将指向下一个客人
现在进行第一次迭代,客人的到达时间是 3,离开时间是 6
- 检查第一个房间是否可用
- 由于第一个客人的离开时间是 2,所以他的房间可以给第二个客人,所以
arrange将变为[[2,6]] - 增加
arriving_guest以指向下一位客人
现在进行第二次迭代,客人的到达时间是 5,离开时间是 8
- 检查第一个房间是否可用
- 由于第二位客人的出发时间是6点,所以他的房间不能给第三位客人,所以应该为第三位客人分配一个新房间,
arrange将变为[[2,6],[8]] - 增加
arriving_guest以指向下一位客人
算法结束
需要的房间 = arrange.size() = 2
可用房间 = K = 1
所以它将返回false 以上的值
如果我将我的算法应用于以下测试用例,它会失败
- 到达:[14、29、0、35、34、15、17、7、28、13、40、28、11、40]
- 出发:[51、77、37、63、76、25、57、23、40、32、63、41、21、68]
- K : 9
我的算法是
private static boolean bookingsPossible(ArrayList<Integer> arrive, ArrayList<Integer> depart, int K) {
// TODO Auto-generated method stub
int arriving_guest = 1;
ArrayList<ArrayList<Integer>> arrange = new ArrayList<ArrayList<Integer>>();
arrange.add(new ArrayList<Integer>(){{
add(depart.get(0));
}});
for(int i=0;i<depart.size();i++)
{
int temp = 0;
System.out.println("i is "+i);
while(temp <= i)
{
System.out.println("arriving guest "+arriving_guest);
if(arriving_guest < arrive.size() && arriving_guest < depart.size())
{
System.out.println("i is in if "+i);
if(temp <= (arrange.size() -1))
{
System.out.println("Temp is "+temp);
int vacatetime = arrange.get(temp).get(arrange.get(temp).size() - 1);
System.out.println("Vacate Time "+vacatetime+" Arrival Time "+arrive.get(arriving_guest));
if(vacatetime <= arrive.get(arriving_guest))
{
arrange.get(temp).add(depart.get(arriving_guest));
arriving_guest++;
System.out.println("Arrangement made "+arrange.toString());
break;
}
}
else
{
System.out.println("Adding room");
ArrayList<Integer> p = new ArrayList<Integer>();
p.add(depart.get(arriving_guest));
arrange.add(p);
System.out.println("Arrangement made "+arrange.toString());
arriving_guest++; break;
}
}
else
{
break;
}
temp++;
}
}
System.out.println("Rooms needed "+arrange.size());
System.out.println("Final Arrangement made "+arrange.toString());
return arrange.size() <= K ? true : false;
}
【问题讨论】:
-
我不会确切地找出问题所在,但我可以发现在
arrange中仅跟踪出发 日期的问题。假设depart和arrive中的第一个条目是5,10,第二个条目是2,3。你的算法会做什么?这是正确的吗?尝试按到达和离开时间对客人进行预分类,看看会发生什么。