CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

救命!某大公司程序员笔试题!答中有重奖!超难算法

楼主poyi_820921()2006-03-30 09:46:20 在 专题开发/技术/项目 / 数据结构与算法 提问

是的这样的:  
   
              有十种水果:     a   有550个,b   有600个,c   有700个,d   有700个,e   有650个,f   有500个,g   500个,h   有600个,i   有600个,j   有500个  
   
            现在有个1000人小学校,要求把这些水果平均分到孩子手里  
   
                      一年级         200人         每人要求分到:9个  
   
                      二年级         100人           每人要求分到:8个  
   
                    三年级             200人         每人要求分到:5个  
   
                  四年级             100人           每人要求分到:3个  
   
   
                五年级             200人               每人要求分到:6个  
   
                六年级           200人                   每人要求分到:4个  
   
   
          要求:要每个人手里实际分到的水果和要求分到的水果恰好相等,没人多拿没人少拿,  
   
        并且所有水果全部分完,一个不剩  
   
        还有一点要求,就是每个人手里的水果不能有重复品种的水果的,也就是说,比如:某人手里不能同时拿到两个A水果,这样是错误的做法  
   
    请各位老大救命,小弟谢了,最好发个源程序,任何语言做的都可以,发到xyz_133676984281@yahoo.com.cn里  
   
  我看行了,再和你联系,买你的源代码,谢谢  
   
  问题点数:20、回复次数:24Top

1 楼gxqcn(★) HugeCalc ← http://hugecalc.ik8.com/ (☆)回复于 2006-03-30 10:50:09 得分 0

这个题目有错!  
   
  1、水果有   5900   个,而学生按要求仅需   5500   个水果,如何“所有水果全部分完,一个不剩”?  
   
  2、每个年级学生数均为整百,若不能切分水果,那么有   550   个的水果   a   能分完吗?Top

2 楼poyi_820921()回复于 2006-03-30 11:10:41 得分 0

这位老哥,题目没错,你把各年级的要求分到的水果总数一加,就是5900个,一个不多,一个不少,题目我确定过了,没错的,Top

3 楼wotobo(晓敢)回复于 2006-03-30 11:14:47 得分 0

每一次分发都要坚持一个原则:  
  一定要保持水果品种的数量最多为前提!  
  所以分发时应该保护某种水果不要被分发完!Top

4 楼gxqcn(★) HugeCalc ← http://hugecalc.ik8.com/ (☆)回复于 2006-03-30 11:15:50 得分 0

是我看错了一个数字:(  
   
  但   “a   有550个,...,e   有650个,”,在现有的条件下是无论如何也无法完成分配的,原因见我第一次回复的第   2   条。(∵550   mod   100   =   50,小心被忽悠了,哈哈)Top

5 楼gxqcn(★) HugeCalc ← http://hugecalc.ik8.com/ (☆)回复于 2006-03-30 11:18:03 得分 0

除非要求同一年级学生有不同的分配方案!  
  (但不知是降低了难度,还是增加了难度,自己揣摩吧。。。)Top

6 楼poyi_820921()回复于 2006-03-30 11:20:39 得分 0

拜托各位,当初我也认为很简单,是小学生的问题,可是用了N种方法,就是做不到每个人实际拿到的,和他应该拿的一样,而且还有剩的水果,求各位仔细想想Top

7 楼poyi_820921()回复于 2006-03-30 11:22:22 得分 0

求各位仔细想想,既然认为简单,就救救我,明天就该...............Top

8 楼gxqcn(★) HugeCalc ← http://hugecalc.ik8.com/ (☆)回复于 2006-03-30 12:25:00 得分 5

一 二  三    四     五    六  
          200 100 200 100  200 200  
  ===========================================  
  a  550  1  1  1  0.5  0  0  
  b  600  1  0  1  0   1  0  
  c  700  1  1  0  0   1  1  
  d  700  1  1  1  0   1  0  
  e  650  1  0  0  0.5  1  1  
  f  500  1  1  1  0   0  0  
  g  500  1  1  0  0   0  1  
  h  600  1  1  0  1   0  1  
  i  600  1  1  0  1   1  0  
  j  500  0  1  1  0   1  0  
  ===========================================  
  (其中表中两个“0.5”表示四年级等分成两组,a或e仅取其一)  
   
  以上结果是随便排出来的,如果不允许出现“0.5”,则无解(原因已阐明)!Top

9 楼coldcool(寒冰)回复于 2006-03-30 12:28:17 得分 5

还是比较简单的,思路如下  
  10种水果  
  6个年纪  
  先吧最多数量的分到最少年纪  
  如4年纪100人,每人3个  
  CDE各减100  
  变成  
  550,600,600,600,550,500,500,600,600,500  
  四年机完成分配  
  分6年纪每人四各200人,四种水果  
  350,400,400,400,550,500,500,600,600,500  
  三年纪200各,五种  
  350,400,400,400,350,300,300,400,400,500  
  以此类推,每次匹配最多的,  
  用for加if语句就可以完成。。  
  写程序好烦。。。  
   
  Top

10 楼zzwu(未名)回复于 2006-03-30 12:47:25 得分 0

同一年级的学生是否要求拿到相同品种的水果?Top

11 楼zzwu(未名)回复于 2006-03-30 13:15:57 得分 5

如果同一年级的学生不要求拿到相同品种的水果,则问题可以  
  用下面的一系列的数学式子来表示:  
   
   
  设i年级分到的第j种水果为nij,(i=1..6,j=0..9,共60个系数)则  
   
  1年级要求的各种水果为:  
      n10*a+n11*b+n12*c+n13*d+n14*e+n15*f+n16*g+n17*h+n18*i+n19*j=200*9;  
   
  2年级要求的各种水果为:  
      n20*a+n21*b+n22*c+n23*d+n14*e+n15*f+n16*g+n17*h+n18*i+n19*j=100*8;  
  ...  
   
  6年级要求的各种水果为:  
      n60*a+n61*b+n62*c+n63*d+n64*e+n65*f+n66*g+n67*h+n68*i+n69*j=200*4;  
   
  (以上共6个方程)  
   
   
  要求满足下列约束:  
   
  1。所有系数(即每个年级每种水果的数目)都是非负整数:  
   
          nij>=0,   i=0...6,   j=0..9    
   
    (共60个约束)  
   
   
  2。分给i年级的第j种水果数目nij应<=该年级人数mi,否则就有人会有相同水果  
   
          nij<=mi,   i=0...6,   j=0..9  
     
      (共60个约束)    
   
   
  3。各种水果总数是已知的,即要求:  
   
      水果a总数=550:  
          n10+n20+n30+n40+n50+n60=550  
   
      水果b总数=600:  
          n11+n21+n31+n41+n51+n61=600  
      ...  
      水果j总数=500:  
          n19+n29+n39+n49+n59+n69=500  
       
      (共10个约束)  
   
   
  这个规划问题共有6+60+60+10=136个等式或不等式方程!  
   
  如不找窍门,要用人工直接求解可不容易!  
   
   
   
   
   
  Top

12 楼gxqcn(★) HugeCalc ← http://hugecalc.ik8.com/ (☆)回复于 2006-03-30 14:10:41 得分 0

前面给的结果排版不是很好,重新排版一下:  
   
  年级|人数 |  a  b  c  d  e  f  g  h  i  j  | ∑  
  ===========|======================================================|=====  
   一 200 |  1  1  1  1  1  1  1  1  1  0  | 9  
   二 100 |  1  0  1  1  0  1  1  1  1  1  | 8  
   三 200 |  1  1  0  1  0  1  0  0  0  1  | 5  
   四 100 |  /  0  0  0  /  0  0  1  1  0  | 3  
   五 200 |  0  1  1  1  1  0  0  0  1  1  | 6  
   六 200 |  0  0  1  0  1  0  1  1  0  0  | 4  
  ===========|============================================================  
    总   计 |    550 600 700 700 650 500 500 600 600 500    |   5900  
   
  其中:  
  “1”——表示该年级取用该水果;  
  “0”——表示该年级不取用该水果;  
  “/”——表示该年级一半人取用该水果。Top

13 楼mmmcd(超超)回复于 2006-03-30 14:20:41 得分 5

不能分果,就分人吧  
  四年级分成50+50的2组  
                        一    二  三    四(1)     四(2)     五    六  
          200 100 200    50     50           200 200  
  ==================================================  
  a  550  1  1  1  1             0       0  0  
  b  600  1  0  1  0       0           1  0  
  c  700  1  1  0  0          0       1  1  
  d  700  1  1  1  0           0       1  0  
  e  650  1  0  0  0          1          1  1  
  f  500  1  1  1  0          0          0  0  
  g  500  1  1  0  0          0          0  1  
  h  600  1  1  0  1          1          0  1  
  i  600  1  1  0  1          1          1  0  
  j  500  0  1  1  0          0          1  0  
  ==================================================Top

14 楼zzwu(未名)回复于 2006-03-30 14:29:49 得分 0

coldcool(寒冰)的思路有道理的,先把数量多水果品种先分掉,  
  这样可以避免剩下数目很多的水果分不出去.  
  但是否一定要先分给人数少的班级,就不一定了.  
  另外,数量多的水果也不一定要全分掉.  
   
   
  Top

15 楼gxqcn(★) HugeCalc ← http://hugecalc.ik8.com/ (☆)回复于 2006-03-30 15:21:11 得分 0

zzwu(未名)   提供的答案与我的似乎是一样的。  
   
  我的策略如下:  
  1、将班级人数从大到小排列,优先分配人数较多的;  
  2、随时将班级每人取用的水果剩余数排序,优先给需求量最大的班级;  
  3、随时将水果排序,优先选用剩余数目较多者。  
   
  不到两分钟就手工排出来了。Top

16 楼freshman520(freshman520)回复于 2006-03-30 18:33:09 得分 0

package   com.won.sys;  
   
  import   java.util.Arrays;  
   
  public   class   Util   {  
   
  private   int   vec[]   =   {   550,   600,   700,   700,   650,   500,   500,   600,   600,   500   };  
   
  public   Util()   {  
  }  
   
  //persons为各年级人数,   sums每人要求分到个数  
  public   void   testSort(int   persons,   int   sums)   {  
   
  try   {  
   
  for   (int   i   =   vec.length   -   sums;   i   <   vec.length;   i++)   {  
   
  int   j   =   0;  
  int   temp   =   vec[i]   -   persons;  
   
  if   (temp   <   0)   {  
  while   (temp   <   0)   {  
   
  temp   =   vec[i]   -   persons   +   vec[j];  
  //说明一下:这个题目刚好一个年级能分到两种水果vec[i]+   vec[j]而不出现负数  
   
  //j一直加到10而不出现负数,不会陷入while死循环,不会出现数组溢出  
  //就是说两种水果不够怎么办?程序得重新写,如果能提供足够多的测试用例就好了  
  j   =   j   +   1;  
   
  }  
   
  temp   =   vec[i]   -   persons   +   vec[j   -   1];  
   
  vec[j   -   1]   =   0;  
   
  }  
   
  vec[i]   =   temp;  
   
  }  
  }   catch   (Exception   e)   {  
  }  
  Arrays.sort(vec);  
   
  }  
   
  //输出完毕  
  public   String   toString()   {  
   
  try   {  
   
  for   (int   i   =   0;   i   <   vec.length;   i++)   {  
   
  System.out.println(vec[i]);  
  }  
  }   catch   (Exception   e)   {  
  }  
  return   "";  
  }  
  }  
   
   
  package   com.won.sys;  
   
  public   class   test   {  
   
  private   int   vec[]   =   {   550,   600,   700,   700,   650,   500,   500,   600,   600,   500   };  
   
  public   static   void   main(String[]   args)   {  
   
  /*  
    *    
    *   一年级   200人   每人要求分到:9个  
    *    
    *   二年级   100人   每人要求分到:8个  
    *    
    *   三年级   200人   每人要求分到:5个  
    *    
    *   四年级   100人   每人要求分到:3个  
    *    
    *    
    *   五年级   200人   每人要求分到:6个  
    *    
    *   六年级   200人   每人要求分到:4个  
    *      
    */  
  Util   util   =   new   Util();  
  util.testSort(200,   9);  
  util.toString();  
  System.out.println("输出完毕");  
  util.testSort(100,   8);  
  util.toString();  
  System.out.println("输出完毕");  
  util.testSort(200,   6);  
  util.toString();  
  System.out.println("输出完毕");  
  util.testSort(200,   5);  
  util.toString();  
  System.out.println("输出完毕");  
   
  util.testSort(200,   4);  
   
  util.toString();  
  System.out.println("输出完毕");  
   
  util.testSort(100,   3);  
  System.out.println("输出完毕");  
  util.toString();  
  System.out.println("输出完毕");  
  }  
  }  
   
   
   
   
  Top

17 楼zzwu(未名)回复于 2006-03-31 08:55:23 得分 0

 
  我认为最简单的方法是:  
   
  1.让学生们按年级排队,如  
   
  1,1,1,1,2,2,2,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,6    
   
      其中每个数字代表一个学生,1代表1年纪学生,2代表2年级学生,等  
      队列实际长度应=1000  
   
  2.把所有品种水果一种一种地拿来,依此1个别个地分给每个学生1个,  
      如果一种发完,就用另一种代替接着发,其形式为:  
  1,1,1,1,2,2,2,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,6  
  a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,b,b,b,b,b,b,b,b,b,b,b,b,b  
  b,b,b,b,b,b,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,c,...  
   
  3.不断发下去,一旦学生得到了应有数目的水果后,就自动离开队列,  
      这样,当所有水果分完,每个学生也就得到了应得的水果数.  
   
  由于没有一种品种的水果数目大于队列长度1000,  
  这种分配方法可以保证每个学生不会得到相同的水果.  
   
  [注]可以看出,学生不按年级排队也无所谓,如穿插地排成如下也可以:  
   
  3,1,4,6,1,2,1,2,3,4,3,6,4,2,4,1,4,1,5,5,2,5,4,6,1,1,2,6,3    
   
  只要得到应得数目的水果后,就自动离开,就可以了.  
   
  Top

18 楼zzwu(未名)回复于 2006-03-31 09:13:39 得分 0

没有对齐,重发(水果品种改用A,B,C...表示)  
   
   
  1.让学生们按年级排队,如  
   
  1,1,1,2,2,3,3,4,4,4,5,5,6,6,6  
   
      其中每个数字代表一个学生,1代表1年纪学生,2代表2年级学生,等  
  队列实际长度应=1000  
   
   
  2.把所有品种水果一种一种地拿来,依此一个个地分给每个学生,  
      如果一种发完,就用另一种代替接着发,分发的过程形式为:  
   
  1,1,1,2,2,3,3,4,4,4,5,5,6,6,6  
   
  A,A,A,A,A,A,A,A,A,A,B,B,B,B,B  
  B,B,B,B,C,C,C,C,C,C,C,C,D,D,D  
  D,D,D,...  
   
  3.不断发下去,一旦某个学生得到了应有数目的水果后,就自动离开队列,  
      这样,当所有水果分完,每个学生也就得到了应得的水果数.  
   
  由于没有一种品种的水果数目大于队列长度1000,  
  这种分配方法可以保证每个学生不会得到相同的水果.  
   
  [注]可以看出,学生不按年级排队也无所谓,如穿插地排成如下也可以:  
   
  3,1,4,6,1,2,1,2,3,4,3,6,4,2,4,1,4,1,5,5,2,5,4,6,1,1,2,6,3    
   
  只要得到应得数目的水果后,就自动离开,就可以了.  
   
   
  Top

19 楼poyi_820921()回复于 2006-03-31 10:16:03 得分 0

谢谢各位的关注,其实这是我在做排考系统中遇到的一个小问题,我拿来了,改了一下外皮,愚人节快到了,也让大家开心一下,哈哈Top

20 楼iamwiner(烛泪)回复于 2006-03-31 10:23:38 得分 0

楼上的可能是问题,你要确定学生们按什么排序,水果按什么顺序发吧?不然可能到最后的时候会出现重复的现象Top

21 楼zzwu(未名)回复于 2006-03-31 11:46:41 得分 0

如果要求同一年级的学生拿到相同品种的水果,   怎么办?  
   
  这仍然一个没有彻底解决的"小问题"!!!  
  Top

22 楼zzwu(未名)回复于 2006-03-31 11:56:24 得分 0

补充:   前面示例中仍要求多的水果先发掉.  
  Top

23 楼poyi_820921()回复于 2006-03-31 13:31:58 得分 0

今天晚上把我做的方法   贴上Top

24 楼zzwu(未名)回复于 2006-04-13 17:38:49 得分 0

贴?Top

相关问题

  • 救命!某大公司程序员笔试题!答中有重奖!超难算法
  • 救命!某大公司程序员笔试题!答中有重奖!超难算法
  • 救命!某大公司程序员笔试题!答中有重奖!超难算法
  • 救命!某大公司程序员笔试题!答中有重奖!超难算法
  • 救命!某大公司程序员笔试题!答中有重奖!超难算法
  • 程序员试题
  • Microsoft程序员测试题
  • 微软程序员考试题
  • 某公司招VC程序员试题
  • 程序员试题,高手请进!!!

关键词

  • 学生
  • 水果
  • 年级
  • 要求
  • nij
  • 年纪
  • 分发
  • 品种
  • 拿到
  • 题目

得分解答快速导航

  • 帖主:poyi_820921
  • gxqcn
  • coldcool
  • zzwu
  • mmmcd

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo