宿舍分配问题

宿舍分配
程序文件名: school.cpp/school.pas/...
  一个很有名的大学NKU里有不少的教学楼和宿舍楼。
  学校为了学生们的切身利益着想,希望能有一个好的分配方案,使得每天早上学生们去上课所要走的路程总和最小。
  为了简化问题,我们假设
1.       每个教学楼都属于一个学院,而且每个学院只有一个教学楼
2.       每天早上第一节每个学生都有课,且这个课是在自己学院楼里上的专业课。
3.       如图所示,宿舍的位置为(Pj,Qj),学院楼的位置为(Xi,Yi)时,这两个楼的距离Dij由下面的公式来决定。
  Dij=|Xi-Pi|+|Yi-Qi|+1
  宿舍分配可以很随意,即同一个学院的学生们可以不住在一起,一个宿舍里也可以住几个不同学院的学生。
  现在学校已经有了一个宿舍分配方案,现在委托编程高手你来验证一下这个方案是不是最优的。
输入(请使用标准输入输出,而不要读写文件)
  输入数据的第1行有两个整数N,MN(1<=N<=100)为学院个数(即教学楼个数),M(1<=M<=100)为宿舍楼个数。
  紧接着的N行为每个学院的资料,每行有3个整数: 学院楼的位置Xi,Yi(-1000<=Xi,Yi<=1000)和学生数Bi(1<=Bi<=1000)
  再下面的M行为每个宿舍的资料,每行有3个整数: 宿舍的位置Pj,Qj(-1000<=Pj,Qj<=1000)和可以住的学生数Cj(1<=Cj<1000)
  最后N行为现在学校的分配方案。
  每行有M个整数。每个整数Eij(1<=i<=N,1<=j<=M,0<=Eij<=1000)表示第i学院的多少个学生住第j宿舍。
  输入的方案一定是有效的,即满足 Bi=Ei1+Ei2+...+Eim, Cj>=(E1j+E2j+...Enj) 
输出(请使用标准输入输出,而不要读写文件)
  若现在的方案是最优的话只要输出一行”yes” (小写字母,不包含引号)。
否则,先输出”no” (小写字母,不包含引号),紧接着输出一个更优越的方案,这个方案可以不是最优的,但一定要比原来的方案更好。
  方案的输出格式跟输入的格式一样,有N行。每行M个数字。每个整数Eij(1<=i<=N,1<=j<=M,0<=Eij<=1000)表示第i学院的多少个学生住第j宿舍。
 
样例输入1
样例输出1
3 4
-3 3 5
-2 -2 6
2 2 5
-1 1 3
1 1 4
-2 -2 7
0 -1 3
3 1 1 0
0 0 6 0
0 3 0 2
no
3 0 1 1
0 0 6 0
0 4 0 1
样例输入2
样例输出2
3 4
-3 3 5
-2 -2 6
2 2 5
-1 1 3
1 1 4
-2 -2 7
0 -1 3
3 0 1 1
0 0 6 0
0 4 0 1
yes
 

暂无答案

 

 

          

基于贪心算法的宿舍分配问题通常是一个优化问题,比如大学新生的住宿安排,需要找到一种最优的方式将学生分配到有限的宿舍,使得每个宿舍的学生人数尽可能接近。这种问题的一个常见版本称为“背包式”贪心算法。 下面是一个简单的Python代码示例,它假设我们有一个包含学生列表(每个学生有名字和需求的宿舍容量)以及可用宿舍列表(每个宿舍有剩余容量)。这个算法会优先选择最大容量差的学生入住剩余容量最大的宿舍: ```python def greedy_room_allocation(students, rooms): # 按照宿舍需求降序排序学生 students.sort(key=lambda x: x['capacity_needed'], reverse=True) # 初始化已分配宿舍和剩余容量字典 assigned_rooms = {} for student in students: best_fit = None max_capacity_diff = float('-inf') # 找出剩余容量能满足学生需求的房间 for room in rooms: if room['remaining'] >= student['capacity_needed']: capacity_diff = room['remaining'] - student['capacity_needed'] if capacity_diff > max_capacity_diff: best_fit = room max_capacity_diff = capacity_diff # 如果找到了合适的房间,分配并更新剩余容量 if best_fit is not None: assigned_rooms[student['name']] = best_fit best_fit['remaining'] -= student['capacity_needed'] rooms.remove(best_fit) # 移除已分配的房间 return assigned_rooms # 示例数据 students = [{'name': 'A', 'capacity_needed': 4}, {'name': 'B', 'capacity_needed': 2}, {'name': 'C', 'capacity_needed': 3}] rooms = [{'name': 'Room1', 'remaining': 6}, {'name': 'Room2', 'remaining': 5}] result = greedy_room_allocation(students, rooms) print(result) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值