按照每个人要求的个数降序排列
一年级 200人 每人要求分到:9个
二年级 100人 每人要求分到:8个
五年级 200人 每人要求分到:6个
三年级 200人 每人要求分到:5个
六年级 200人 每人要求分到:4个
四年级 100人 每人要求分到:3个然后依次发过去
水果的种类按个数升序排列起始状态
对水果按个数多少降序排
  c   d   e   b   h   i   a   j   f   g
  700 700 650 600 600 600 550 500 500 500
发完一年级后
     c   d   e   b   h   i   a   j   f   g
     700 700 650 600 600 600 550 500 500 500
-200
     500 500 450 400 400 400 350 300 300 500 再对水果进行降序排
g    c   d   e   b   h   i   a   j   f   
500  700 700 650 600 600 600 550 500 500 
500  500 500 450 400 400 400 350 300 300 
发完二年级后
     g    c   d   e   b   h   i   a   j   f   
    500  500 500 450 400 400 400 350 300 300 
-100  
    400 400 400 350 300 300 300 250  300 300
 
再对水果进行降序排
 g    c   d   e  j   f   b   h   i   a  
 400 400 400 350 300 300 300 300 300 250  再分五年级
      g    c   d   e  j   f   b   h   i   a  
      400 400 400 350 300 300 300 300 300 250 
-200
      200 200 200 150 100 100 300 300 300 250再对水果进行降序排
b   h   i   a    g    c   d   e  j   f     
300 300 300 250  200 200 200 150 100 100 再分三年级
     b   h   i   a    g    c   d   e  j   f     
     300 300 300 250  200 200 200 150 100 100 
-200
     100 100 100 50   0   200 200 150 100 100再对水果进行降序排
 c   d   e   j   f    b   h   i   a    g      
 200 200 150 100 100  100 100 100 50   0   再分六年级
     c   d   e   j     f    b   h   i   a    g      
     200 200 150 100   100  100 100 100 50   0   
-200
     0   0    0   50   0    0   100 100 50   0再对水果进行降序排
 h   i   a  j   c   d    e   j    f    b       g    
 100 100 50  50 0   0    0   0    0    0       0
再分四年级
    h   i     a   j      c   d    e   j    f    b       g    
    100 100   50  50     0   0    0   0    0    0       0
-100
    0   0      0   0      0   0   0   0     0    0       0

解决方案 »

  1.   

    算法:我就用伪码写了自己改成某种语言的
    Array f->水果的数组  f[i] 表示该种水果当前的数量
    indexF->sort(indexF)使indexF 按f[i]值 降序排列Array g->要发水果的年级数组 g[i]表示该年级每个学生所要发的水果数
    indexG->sort(indexG)使indexG按g[i]值降序排列当前年级  gCurrent -> indexG[0];
    do 
       给当前年级发所需的n种水果,(如果当前的某种水果数不足所需的数量,后面一种补充上来,并          且要保证后面一种只发一次) (上面的例子中发六年级的时候可能处理不妥,即e 150 ,j100,)发完所需的200之后,j的50 不能再发)   
       f[i]->f[i]减去已经发的水果
       indexF->sort(indexF)   while 所有年级还没有发完
     
      

  2.   

    仿照楼上一下
    按照每个人要求的个数降序排列
    一年级 200人 每人要求分到:9个
    二年级 100人 每人要求分到:8个
    五年级 200人 每人要求分到:6个
    三年级 200人 每人要求分到:5个
    六年级 200人 每人要求分到:4个
    四年级 100人 每人要求分到:3个水果的种类按个数降序排列
    c d e b h i a j f g
    700 700 650 600 600 600 550 500 500 500
    按年级分发,每发一人水果的种类按个数降序排列一次,
    依次去所需水果种类个数这样效率低了一点,但算法简单一些
      

  3.   

    wizardblue(不死鱼) ,lilijr(beavers)大哥,谢谢你们先,可你们的用法我也用过了,最后的结果是,不是水果没分完,就是有人多拿,或少拿,拜托各位再想想,如果是一般的问题,我也不会拿来这里了
      

  4.   

    最后不是 
    h i a j c d e j f b g
    100 100 50 50 0 0 0 0 0 0 0
    -100
    0 0 0 0 0 0 0 0 0 0 0
    了么?
      

  5.   

    好人一生平安,wizardblue(不死鱼),我要向你学习,多多帮助弱者
      

  6.   

    已经发分给你了,wizardblue(不死鱼) ,想认识你,可以吗?交个朋友