Algorithm 蛇形算法
你能帮我做一个分配算法吗 事情是这样的。我有笔数=(学生人数*每个学生的笔数) 所以,如果我有18个学生,每个学生有3支笔,那么我们总共有54支笔。 每支笔上都有一个订单号,比如:Pen1,Pen2,Pen3。我们必须像这样用蛇形笔将笔的数量均匀地分配给每个学生:Algorithm 蛇形算法,algorithm,Algorithm,你能帮我做一个分配算法吗 事情是这样的。我有笔数=(学生人数*每个学生的笔数) 所以,如果我有18个学生,每个学生有3支笔,那么我们总共有54支笔。 每支笔上都有一个订单号,比如:Pen1,Pen2,Pen3。我们必须像这样用蛇形笔将笔的数量均匀地分配给每个学生: (假设18名学生) 如果每个用户一支笔: 人1:笔1 第二人:第二支笔 第三人:第三支笔 … 第18人:第18支笔 2个单位: 第1人:第1笔和第36笔 第2人:第2笔和第35笔 第三人:第三笔和第34笔 … 第18人:第18笔和第1
(假设18名学生) 如果每个用户一支笔:
人1:笔1
第二人:第二支笔
第三人:第三支笔
…
第18人:第18支笔 2个单位: 第1人:第1笔和第36笔
第2人:第2笔和第35笔
第三人:第三笔和第34笔
…
第18人:第18笔和第19笔
3个单位: 第一个人:第1单元、第36单元、第37单元
第二个人:第二单元、第35单元、第38单元
第三人:第三单元、第34单元、第39单元
…
第18个人:第18单元、第19单元、第54单元
每个学生4个单元: 第1个人:第1单元、第36单元、第37单元和第72单元
第二个人:第二单元、第35单元、第38单元和第71单元
第三个人:第三单元、第34单元、第39单元和第70单元
…
第18人:第18单元、第19单元、第54单元、第55单元 所以,输入是每个学生的学生数+笔数。我需要输出一个分布(数组)有一个模式 每个学生5个单元: person 1: unit 1, unit 36, unit 37, unit 72, unit 73 person 2: unit 2, unit 35, unit 38, unit 71, unit 74 person 3: unit 3, unit 34, unit 39, unit 70, unit 75 ... person 18: unit18, unit 19, unit 54, unit 55, unit 90 第1组:第1组、第36组、第37组、第72组、第73组 第二个人:第二单元、第35单元、第38单元、第71单元、第74单元 第三人:第三单元、第34单元、第39单元、第70单元、第75单元 ... 第18人:第18单元、第19单元、第54单元、第55单元、第90单元 等等 这与每人4个单位相同,每列上增加一列,上下交替计数。这是最重要的 下表将告诉您要给每个人哪些笔:
person Pen 1 Pen 2 Pen 3 Pen 4
1 PERSONS*0+1 PERSONS*2-0 PERSONS*2+1 PERSONS*4-0
2 PERSONS*0+2 PERSONS*2-1 PERSONS*2+2 PERSONS*4-1
3 PERSONS*0+3 PERSONS*2-2 PERSONS*2+3 PERSONS*4-2
4 PERSONS*0+4 PERSONS*2-3 PERSONS*2+4 PERSONS*4-3
:
:
N PERSONS*0+N PERSONS*2-(N-1) PERSONS*2+N PERSONS*4-(N-1)
^ ^ ^ ^
| | | |
+--- start at 0 and increase 2 every 2 pens ---+---> 4, 6, 6, 8
从两个方向依次类推。下面的这个Python代码片段应该可以为nbPerson和nbItems的所有正值(例如,将7个项目分别分配给23个人等)提供帮助。
简而言之,想法是按行填写表格,生成每个单元格中给定的项目编号,作为行和列编号的函数 在代码段中,
person
变量是基于[1]的行号,item
变量是基于[1]的列号。主要技巧是将itemNo分配为一个总和:前面完成的列中的项数(
(项-1)*nbPersons
)加上当前列中的项数。当前列的值取决于列是偶数还是奇数,因为偶数列必须“倒计时”。在代码中,forumulas是为了可读性而特意“拼写”出来的;它们可以被分解
nbPersons = 18 // change these, or turn them into
nbItemsPP = 5 // a function's arguments
for person in range(1, nbPersons + 1):
print "Person ", person
for item in range (1, nbItemsPP + 1):
if item % 2 == 1: // odd column ?
unitNo = (item - 1) * nbPersons + person
else: // even column ?
unitNo = (item - 1) * nbPersons + nbPersons - person + 1
print " U# ", unitNo,
print
结果:
Person 1 U# 1 U# 36 U# 37 U# 72 U# 73
Person 2 U# 2 U# 35 U# 38 U# 71 U# 74
Person 3 U# 3 U# 34 U# 39 U# 70 U# 75
Person 4 U# 4 U# 33 U# 40 U# 69 U# 76
Person 5 U# 5 U# 32 U# 41 U# 68 U# 77
Person 6 U# 6 U# 31 U# 42 U# 67 U# 78
Person 7 U# 7 U# 30 U# 43 U# 66 U# 79
Person 8 U# 8 U# 29 U# 44 U# 65 U# 80
Person 9 U# 9 U# 28 U# 45 U# 64 U# 81
Person 10 U# 10 U# 27 U# 46 U# 63 U# 82
Person 11 U# 11 U# 26 U# 47 U# 62 U# 83
Person 12 U# 12 U# 25 U# 48 U# 61 U# 84
Person 13 U# 13 U# 24 U# 49 U# 60 U# 85
Person 14 U# 14 U# 23 U# 50 U# 59 U# 86
Person 15 U# 15 U# 22 U# 51 U# 58 U# 87
Person 16 U# 16 U# 21 U# 52 U# 57 U# 88
Person 17 U# 17 U# 20 U# 53 U# 56 U# 89
Person 18 U# 18 U# 19 U# 54 U# 55 U# 90
这听起来很像我的家庭作业。你试过什么?你被困在哪里?我看不出这里的逻辑。如果我有5个单位,我甚至无法理解如何分配。这不是一个家庭作业。考虑到我在“蛇形算法”上找不到任何东西,我也说这是一个家庭作业。逻辑很简单:人X将得到笔X,人*2-(X-1),人*2+X,人*4-(X-1),人*4+X,人*6-(X-1),人*6+X,等等。换句话说,顺序是人N+X,人-(X-1),其中N从0开始,每次迭代增加2,X从1增加到人数。只需选择每支笔的数量,并适当地停止。然而,如果这不是家庭作业,那到底是什么?什么样的程序需要这种特殊的功能?作为参考,这可能是你的代码帮助了很多,但我只能接受一个答案。谢谢