Algorithm 蛇形算法

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个学生,每个学生有3支笔,那么我们总共有54支笔。 每支笔上都有一个订单号,比如:Pen1,Pen2,Pen3。我们必须像这样用蛇形笔将笔的数量均匀地分配给每个学生:
(假设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增加到人数。只需选择每支笔的数量,并适当地停止。然而,如果这不是家庭作业,那到底是什么?什么样的程序需要这种特殊的功能?作为参考,这可能是你的代码帮助了很多,但我只能接受一个答案。谢谢