CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

百度之星程序设计大赛初题目

楼主mmmcd(超超)2006-06-01 08:23:08 在 专题开发/技术/项目 / 数据结构与算法 提问

1.百度语言翻译机    
  百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套独特的缩略语。他们在平时的交谈、会议,甚至在各种技术文档中都会大量运用。  
   
  为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩略语和专有名词翻译成日常语言。  
   
  输入要求:  
  输入数据包含三部分:  
  1.   第一行包含一个整数N(N<=10000),表示总共有多少个缩略语的词条;  
  2.   紧接着有N行的输入,每行包含两个字符串,以空格隔开。第一个字符串为缩略语(仅包含大写英文字符,长度不超过10字节),第二个字符串为日常语言(不包含空格,长度不超过255字节);  
  3.   从第N+2开始到输入结束为包含缩略语的相关文档(总长度不超过1000000个字节)。例:  
  6  
  PS   门户搜索部  
  NLP   自然语言处理  
  PM   产品市场部  
  HR   人力资源部  
  PMD   产品推广部  
  MD   市场发展部  
  百度的部门包括PS,PM,HR,PMD,MD等等,其中PS还包括NLP小组。  
  样例:in.txt    
   
  输出要求:  
  输出将缩略语转换成日常语言后的文档。(将缩略语转换成日常语言,其他字符保留原样)。例:  
  百度的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等,其中门户搜索部还包括自然语言处理小组。  
  样例:out.txt    
   
  2.饭团的烦恼    
  “午餐饭团”是百度内部参与人数最多的民间组织。  
  同一个部门的、同一所大学的、同一年出生的、使用同一种型号电脑的员工们总是以各种理由组织各种长期的、临时的饭团。  
   
   
  参加饭团,不仅可以以优惠的价格尝到更加丰富的菜式,还可以在吃饭的时候和同事们增进感情。  
  但是,随着百度的员工越来越多,各个饭团的管理变得繁杂起来。特别是为了照顾员工们越来越挑剔的胃,饭团的点菜负责人的压力也越来越大。现在,这个任务就交给“百度之星”了,因为,你将要为所有的百度饭团设计一个自动点菜的算法。  
   
   
  饭团点菜的需求如下:  
  1.经济是我们要考虑的一个因素,既要充分利用百度员工的午餐补助,又不能铺张浪费。因此,我们希望最后的人均费用越接近12元越好。  
  2.菜式丰富是我们要考虑的另一个因素。为简单起见,我们将各种菜肴的属性归结为荤菜,素菜,辛辣,清淡,并且每个菜只能点一次。  
  3.请谨记,百度饭团在各大餐馆享受8折优惠。  
   
   
  输入要求:  
  1.输入数据第一行包含三个整数N,M,K(0<N<=16,0<M<=N,0<K<=12),分别表示菜单上菜的数目,饭团需要点的菜的数目,就餐的人数;  
  2.紧接着N行,每行的格式如下:  
  菜名(长度不超过20个字符)   价格(原价,整数)   是否荤菜(1表示是,0表示否)   是否辛辣(1表示是,0表示否);  
  3.第N+2行是   a   b   c   d   四个整数,分别表示需要点的荤菜,素菜,辛辣,清淡菜的数目。例:  
  3   2   2  
  水煮鱼   30   1   1  
  口水鸡   18   1   1  
  清炖豆腐   12   0   0  
  1   1   1   1  
  样例:in.txt  
   
   
  输出要求:  
  对于每组测试数据,输出数据包含M+1行,前M行每行包含一个菜名(按菜名在原菜单的顺序排序)。第M+1行是人均消费,结果保留两位小数。例:  
  口水鸡  
  清炖豆腐  
  12.00  
  样例:out.txt    
   
  问题点数:200、回复次数:134Top

1 楼mmmcd(超超)回复于 2006-06-01 08:23:46 得分 0

3.变态比赛规则    
  为了促进各部门员工的交流,百度举办了一场全公司范围内的“拳皇”(百度内部最流行的格斗游戏)友谊赛,负责组织这场比赛的是百度的超级“拳皇”迷W.Z。W.Z不想用传统的淘汰赛或者循环赛的方式,而是自己制定了一个比赛规则。  
   
   
  由于一些员工(比如同部门或者相邻部门员工)平时接触的机会比较多,为了促进不同部门之间的交流,W.Z希望员工自由分组。不同组之间的每两个人都会进行一场友谊赛而同一组内的人之间不会打任何比赛。  
   
   
  比如4个人,编号为1~4,如果分为两个组并且1,2一个组,3,4一个组,那么一共需要打四场比赛:1   vs   3,1   vs   4,2   vs   3,2   vs   4。   而如果是1,2,3一组,4单独一组,那么一共需要打三场比赛:   1   vs   4,2   vs   4,3   vs   4。  
   
   
  很快W.Z意识到,这样的比赛规则可能会让比赛的场数非常多。W.Z想知道如果有N个人,通过上面这种比赛规则,总比赛场数有可能为K场吗?比如3个人,如果只分到一组则不需要比赛,如果分到两组则需要2场比赛,如果分为三组则需要3场比赛。但是无论怎么分都不可能恰需要1场比赛。  
   
   
  相信作为编程高手的你一定知道该怎么回答这个问题了吧?   那么现在请你帮助W.Z吧。  
   
   
  输入要求:  
  每行为一组数据,包含两个数字   N,   K(0<N<=500,   K>=0)。例:  
  2   0  
  2   1  
  3   1  
  3   2  
  样例:in.txt  
   
   
  输出要求:  
  对输入的N,K   如果N个员工通过一定的分组方式可以使比赛场数恰好为K,则输出"YES",否则输出"NO"(请全部使用大写字母),每组数据占一行。例:  
  YES  
  YES  
  NO  
  YES  
  样例:out.txt  
   
   
  4.蝈蝈计分    
  蝈蝈小朋友刚刚学会了0~9这十个数字,也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只要记录连续得分的情况就可以了,比如用“3   2   4”可以表示一方在这一局中连得三分后,输了两分,接着又连得到四分。可是,后来大人们发现蝈蝈只会用0~9这十个数字,所以当比赛选手得分超过9的时候,他会用一个X来表示10完成记分。但问题是,当记录为“X   3   5”的时候,蝈蝈自己也记不起来是一方连续得到十三分后,再输五分;还是先赢十分输三分再赢五分。    
   
  因为百度内部就要开始进行羽毛球联赛了,要先摸清大家的实力才好分组比赛呢~于是,大人们想知道以前每局的比分是怎样的,以及谁获得了胜利。要是遇到了根据比赛记录无法确认比赛过程的情况,也要输出相应的提示哦。    
   
  需要进一步说明的是,比赛是五局三胜的,每局先获得二十一分的为胜,但是胜方必须领先对手两分或以上,否则必须继续比赛直到一方超出对手两分为止,比分多的一方获胜。任何一方先获胜三局后就获得最终胜利,比赛也相应的结束。而且蝈蝈保证是完整的无多余信息的记录了比赛。    
   
  输入要求:  
  1.文件中第一行只有一个整数M,表示蝈蝈记录了多少场比赛的分数;  
  2.在接下来的2M行里,每场比赛用两行记录,第一行是一个整数N(N<=1000)表示当前这个记录中有多少个字符,第二行就是具体的N个字符表示记录的分数(相邻字符用空格隔开)。例:  
  3  
  23  
  9   7   3   6   2   4   7   8   3   2   7   9   X   2   2   1   2   1   X   1   X   1   1  
  25  
  9   3   8   5   4   8   3   9   8   4   X   X   X   X   2   X   X   X   X   2   8   4   9   2   4  
  43  
  7   7   7   7   7   3   4   5   6   7   6   5   4   2   1   3   5   7   9   7   5   3   1   3   0   9   9   3   9   3   2   1   1   1   5   1   5   1   5   1   5   5   1  
  样例:in.txt  
   
   
  输出要求:  
  对应每一个分数记录,输出相应的每局分数,每局分数都使用两个整数表示,表示两个选手的得分,中间用":"分隔开;每组分数记录间使用一个空行分隔开。如果相应的比赛结果无法预测,以“UNKNOWN”一个单词独占一行表示(请全部使用大写字母)。例:  
  21:17  
  24:22  
  21:3  
   
  UNKNOWN  
   
  21:14  
  20:22  
  21:23  
  21:16  
  21:9  
  样例:out.txt  
   
   
  Top

2 楼mmmcd(超超)回复于 2006-06-01 08:24:24 得分 0

5.座位调整    
  百度办公区里到处摆放着各种各样的零食。百度人力资源部的调研发现,员工如果可以在自己喜欢的美食旁边工作,效率会大大提高。因此,百度决定进行一次员工座位的大调整。  
   
  调整的方法如下:  
  1.首先将办公区按照各种零食的摆放分成N个不同的区域(例如:可乐区,饼干区,牛奶区等等);  
  2.每个员工对不同的零食区域有不同的喜好程度(喜好程度是1~100的整数,   喜好程度越大表示该员工越希望被调整到相应的零食区域);  
  3.由于每个零食区域可以容纳的员工数量有限,人力资源部希望找到一个最优的调整方案使得总的喜好程度最大。  
   
   
  输入要求:  
  文件第一行包含两个整数N,M(N>=1,M<=300)。分别表示N个区域和M个员工;  
  第二行是N个整数构成的数列a,其中a[i]表示第i个区域可以容纳的员工数(1<=a[i]<=M,a[1]+a[2]+...+a[N]=M);  
  紧接着是一个M*N的矩阵P,P(i,j)表示第i个员工对第j个区域的喜好程度。例:  
  3   3  
  1   1   1  
  100   50   25  
  100   50   25  
  100   50   25  
  样例:in.txt  
   
   
  输出要求:  
  对于每个测试数据,输出可以达到的最大的喜好程度。例:  
  175  
  样例:out.txt  
   
   
  6.剪刀石头布    
  N个小孩正在和你玩一种剪刀石头布游戏(剪刀赢布,布赢石头,石头赢剪刀)。N个小孩中有一个是裁判,其余小孩分成三组(不排除某些组没有任何成员的可能性),但是你不知道谁是裁判,也不知道小孩们的分组情况。然后,小孩们开始玩剪刀石头布游戏,一共玩M次,每次任意选择两个小孩进行一轮,你会被告知结果,即两个小孩的胜负情况,然而你不会得知小孩具体出的是剪刀、石头还是布。已知各组的小孩分别只会出一种手势(因而同一组的两个小孩总会是和局),而裁判则每次都会随便选择出一种手势,因此没有人会知道裁判到底会出什么。请你在M次剪刀石头布游戏结束后,猜猜谁是裁判。如果你能猜出谁是裁判,请说明最早在第几次游戏结束后你就能够确定谁是裁判。  
   
  输入要求:  
  输入文件包含多组测试数据,每组测试数据第一行为两个整数N和M(1<=N<=500,0<M<=2000),分别为小孩的个数和剪刀石头布游戏进行的次数。接下来M行,每行两个整数且中间以一个符号隔开。两个整数分别为进行游戏的两个小孩各自的编号(为小于N的非负整数)。符号的可能值为“=”、“>”和“<”,分别表示和局、第一个小孩胜和第二个小孩胜三种情况。例:  
  3   3  
  0<1  
  1<2  
  2<0  
  3   5  
  0<1  
  0>1  
  1<2  
  1>2  
  0<2  
  4   4  
  0<1  
  0>1  
  2<3  
  2>3  
  1   0  
  样例:in.txt  
   
   
  输出要求:  
  1.每组测试数据输出一行,若能猜出谁是裁判,则输出裁判的编号,并输出在第几次游戏结束后就能够确定谁是裁判,小孩的编号和游戏次数以一个空格隔开;  
  2.如果无法确定谁是裁判,输出-2;如果发现剪刀石头布游戏的胜负情况不合理(即无论谁是裁判都会出现矛盾),则输出-1。例:  
  -2  
  1   4  
  -1  
  0   0  
  样例:out.txt  
   
   
  Top

3 楼cestar2005(往事随风)回复于 2006-06-01 09:46:58 得分 2

UP,挺有意思的需求...Top

4 楼hchf_1(春风)回复于 2006-06-01 10:28:38 得分 2

我是新人,参加这个比赛全军覆没。不知道他们的测试用例是什么样的。我的程序在本机上的g++编译全部通过而且样本输入也全部通过.....................Top

5 楼mmmcd(超超)回复于 2006-06-01 10:47:15 得分 0

^_^  
  希望有高手帖出程序供新人参考Top

6 楼jp1984(mathfrog)回复于 2006-06-01 12:52:29 得分 2

看了以下1,2较简单.后面有点难度.Top

7 楼haozi8123(无名人)回复于 2006-06-01 14:25:03 得分 2

先作个记号,回去慢慢想。Top

8 楼sinall()回复于 2006-06-01 14:58:10 得分 2

-_-|||  
  做了下,很粗糙的算法。  
  遗留问题,无法区分下面三个部门:  
  PM   产品市场部  
  PMD   产品推广部  
  MD   市场发展部  
   
  源码:  
  #define   DEBUG  
  #include   <string>  
  #include   <map>  
  #include   <iostream>  
  #include   <fstream>  
  #include   <boost/lexical_cast.hpp>  
  //#include   <boost/algorithm/string/replace.hpp>  
   
  using   namespace   std;  
  using   namespace   boost;  
   
  class   Translate  
  {  
          Translate(const   Translate&);  
          void   operator=(const   Translate&);  
  public:  
          Translate(const   string&   filename);  
          void   translate(const   string&   filename);  
  protected:  
          void   parse();  
          void   translate();  
          void   parse_one_line(const   string&   str);  
  private:  
          ifstream   file;  
          int   num;  
          map<string,   string>   map_of_ab;  
          string   source;  
          string   target;  
  };  
   
  int   main(void)  
  {  
          Translate   tra("in.txt");  
          tra.translate("out.txt");  
   
          return   0;  
  }  
   
  Translate::Translate(const   string&   filename)  
          :   file(filename.c_str())  
  {  
  }  
   
  void   Translate::translate(const   string&   filename)  
  {  
          parse();  
          translate();  
          ofstream   out(filename.c_str());  
          out   <<   target;  
  }  
   
  void   Translate::parse()  
  {  
          string   buf;  
          getline(file,   buf,   '\n');  
          num   =   lexical_cast<   int   >(buf);  
  #ifdef   DEBUG  
          cout   <<   "num   :   "   <<   num   <<   endl;  
  #endif  
         
          for   (int   i   =   0;   i   <   num   &&   !file.eof();   ++i)  
          {  
                  getline(file,   buf,   '\n');  
  #ifdef   DEBUG  
                  cout   <<   "buf   :   "   <<   buf   <<   endl;  
  #endif  
                  parse_one_line(buf);  
          }  
   
          file   >>   source;  
  #ifdef   DEBUG  
          cout   <<   "source   :   "   <<   source   <<   endl;  
  #endif  
  }  
   
  void   Translate::translate()  
  {  
          target   =   source;  
          for   (map<string,   string>::const_iterator   i   =   map_of_ab.begin();   i   !=   map_of_ab.end();   ++i)  
          {  
  //             replace(target,   i.first,   i.second);  
                  string::size_type   st;  
                  st   =   target.find(i->first);  
                  if   (st   !=   string::npos)  
                  {  
                          target.replace(st,   i->first.size(),   i->second);  
                  }  
          }  
  }  
   
  void   Translate::parse_one_line(const   string&   str)  
  {  
          string::size_type   st;  
          st   =   str.find('   ');  
          map_of_ab[str.substr(0,   st)]   =   str.substr(st   +   1,   str.size());  
  #ifdef   DEBUG  
          cout   <<   "key   :   |"   <<   str.substr(0,   st)   <<   "|   value   :   |"   <<   map_of_ab[str.substr(0,   st)]   <<   "|"   <<   endl;  
  #endif  
  }Top

9 楼sinall()回复于 2006-06-01 15:09:39 得分 0

其实,PM   PMD   MD   的区分也很好做,简单的做法是将它们排序(按长度和字典序)。  
  然后再做替换即可。  
  Top

10 楼stonepeter(笨笨石头.NET_从公务员转身成为了程序员)回复于 2006-06-01 15:54:19 得分 2

MARK一下。百度是很看重算法的吧?Top

11 楼weimj()回复于 2006-06-01 15:58:59 得分 2

sinall()   (   )   信誉:100  
  这些题都是考验算法设计,所以这题应该是让构造一棵树来进行匹配  
   
  mmmcd   (超超)  
  最后一题的输出看不懂啊,为什么最后一行是"0,0"?Top

12 楼mmmcd(超超)回复于 2006-06-01 16:34:41 得分 0

不好意思,  
  第6题整道题的描述我都不太理解,裁判和非裁判的区别在哪里?Top

13 楼sinall()回复于 2006-06-01 17:11:38 得分 0

呵呵,  
  我理解第一题的重点在于缩略语替换。  
  不知道大家有什么好的算法。  
  Top

14 楼weimj()回复于 2006-06-01 18:25:15 得分 2

裁判会出三种手势,非裁判只会出一种.  
  看贴吧里也有人对那个"0,0"有疑问,但没看到回复Top

15 楼dengsf(drklnk@Radical_Dreamer)回复于 2006-06-01 21:02:23 得分 2

LZ   将你的程序帖出来让我们学习一下啊~  
   
  我的初步想法,高手请指正:  
   
  1:  
  jp1984说很简单,不过我没想到简洁的办法。  
  因为可能有前缀/后缀等问题,比如例子里的   PM,PMD,MD。还可能会有   F*UCK,S*UCK   等,甚至更复杂。  
  先想到的就是死做,先构造   NFA,然后转   DFA。。  
  不过   10000   个,不知效率如何。  
  没想太多。jp1984   能否说说你的想法?  
   
  2:  
  数目很小,强行回溯,或者DP估计也行。  
   
  3:  
  经过简单的转换其实题目就是  
  已知:  
    n1   +   n2   +   ...   +   nk   =   N     (k   未知,而且   ni>=   0)  
  问:  
    n1*n1   +   n2*n2   +   ...   +   nk*nk   =   M   是否有解。(M是经过转换的,不同于题目的K)  
  没想到简洁的方法,就是搜。  
  但搜索过程是从大到小来做,即   n1>=n2>=...>=nk  
  可以限制搜索的范围。如下:  
    假如   n1   已经给定,则其   最小的可能值是   n1*n1   +   (n-n1),由此可确定   n1   的上界。  
    n1给定,其最大的可能值是   n1*n1*(N/n1)   +   (N%n1)^2,由此可确定   n1   的下界。  
  上下界用二分法来确定,对   500   来说,效率比求平方根要快。  
  为进一步提高效率,可以先计算较小的一些结果,  
  比如先计算   100   以内能否达到指定值的表,大小为   10000*100,占1M左右。  
   
  4。  
  感觉回溯就可以,  
  因为分析一下发现出现歧义的   X   的数目是不会太多的,  
  特别是连续的   X   不可能多于   5   个,  
  而且即使有连续   5   个,有歧义的也只有   1-2   个。  
  不过没写过,可能有遗漏的地方。  
   
  5。  
      各区的容量之和   刚好等于   员工总数,真巧。  
  构造二分图,分   员工   和   工作区   两部分,  
  一个员工代表一个结点,  
  而工作区能容纳多少人就建多少个结点,  
  最后就是求   最大匹配。最大是个   300*300   的完全二分图。  
      好象也可以用求最小费用流的方法来求。  
      这两种算法我只是了解,没写过程序,不知效率如何。。。  
   
  6。  
  楼上好象有说不清楚意思的。  
  我也是,但我的理解是:  
      非裁判只会出一种手势,而裁判则随机出。  
      如果根据条件能判断出有且仅有一个人肯定是裁判的,即使有对其他人的信息还有不清楚之处,也认为可以猜出结果;   如果根据条件判断出有多个符合裁判条件的人,则认为是错误;   剩下的情况就是不能猜。  
   
  我的想法有点类似并查集的做法。  
  开始每个人代表一个集合,  
      每个人都有一个数字表示自己在所属集合里的   相对组号码。  
      而号码代表哪组是无法知道的,只代表相对意义。  
      每个人还有一个数字表示裁判候选值,初始为   0。  
      每当有一次比赛,觉得该人可能是裁判的,就将该值加   1。  
  然后依次读入比赛结果,  
    -如果这两个人是属于不同集合的,  
      则将人少的合并到人多的那个集合,  
      并修改该集合的   所有结点   的相对组号。  
      比如元素多的集合那个成员的相对组号为   0,  
      根据规则,   2<0<1<2...   (看我们具体如何定义),  
      再根据战斗结果,若该成员输,则属于被合并集合那人合并后的号码应该是   1。。。  
      反之类似。  
      这里总的时间消耗分析类似于并查集的分析,可认为是   O(n)  
    -如果这两人是属于同一集合的,  
      则如果比赛结果跟相对组号代表一致的就没事发生。  
      如果不一致,则肯定这两人必定有一人是裁判,但无法确定,  
      将两人的   裁判候选值   加   1。  
   
  到结束了,检查所有成员的   裁判候选值。  
  如果有且仅有一个成员的候选值   >=   2   的,则输出;  
  如果有多个   >=2   的,错误。  
  如果没有   >=   2   的:  
      如果有多个   ==   1   的,错误。(不可能只有一个的)  
      如果没有的,无法确定。  
   
  至于要知道什么时候确定裁判的的,可以在增加裁判候选值的同时填入当前的记录数。  
   
  刚想到的问题,  
  可能有两个裁判候选人反复猜拳而导致他们的   裁判候选值   不断增加。。  
  解决办法是增加一个数组记录两个人是否曾经进行了一次增加裁判候选值的比赛,  
  第一次增加时就设置它并进行上述的操作,  
  之后再出现的就全部忽略。  
   
  。。。  
  不知还有没有没注意的错误。  
   
  Top

16 楼dengsf(drklnk@Radical_Dreamer)回复于 2006-06-01 21:10:19 得分 0

补充一下:  
  3。  
      求   100   以内的结果可以用   DP。  
   
  6。  
      最后那个特例   1,0   输出   0,0  
      因为肯定有一个裁判,所以如果只有   1   个人的话,那肯定就是他。  
      只需要处理人数为   1   的特例就可以了。  
   
      记录什么时候确定裁判的那里只是简单说说,实际中要多考虑一些东西的。  
  Top

17 楼DraculaW(成爲牛人,然後離開)回复于 2006-06-02 02:20:17 得分 2

留名回看Top

18 楼chjpeng(鹏(招聘.net web开发程序员))回复于 2006-06-02 08:04:52 得分 2

做个记号~Top

19 楼mmmcd(超超)回复于 2006-06-02 08:48:13 得分 0

第二题,数据量很小,随便一个回溯搜索都行吧  
   
  #include   <stdio.h>  
  #include   <math.h>  
  int   N,M,K;  
  char   s[16][30];  
  int   pri[16],de[16],a,b,c,d;          
   
  bool   ans[16],res[16];  
  double   price;  
   
  void   go(int   k,int   x,int   p){  
          if(k>N)  
                  return;  
          if(a<0   ||   b<0   ||   c<0   ||   d<0   ||   x>M){  
                  return;  
          }  
          if(a==0   &&   b==0   &&   c==0   &&   d==0   &&   x==M){  
                  if(price==-1   ||   price>fabs(p*0.8/M-12.0)){  
                          for(int   i=0;i<N;i++){  
                                  res[i]=ans[i];  
                          }  
                          price=p*0.8/M;  
                  }  
                  return;  
          }  
          ans[k]=1;  
          a-=de[k]/2;  
          b-=de[k]%2;  
          c-=1-de[k]/2;  
          d-=1-de[k]%2;  
          go(k+1,x+1,p+pri[k]);  
          ans[k]=0;  
          a+=de[k]/2;  
          b+=de[k]%2;  
          c+=1-de[k]/2;  
          d+=1-de[k]%2;  
          go(k+1,x,p);  
  }  
   
  void   output(){  
          for(int   i=0;i<N;i++){  
                  if(res[i])  
                          printf("%s\n",s[i]);  
          }  
          printf("%.2lf\n",price);  
  }  
   
  int   main(int   argc,   char*   argv[])  
  {  
          FILE   *fin=fopen(argv[1],"r");  
          fscanf(fin,"%d   %d   %d",&M,&N,&K);  
          for(i=0;i<N;i++){  
                  fscanf(fin,"%s   %d   %d   %d",s[i],&pri[i],&a,&b);        
                  de[i]=a*2+b;  
          }  
          fscanf(fin,"%d   %d   %d   %d",&a,&b,&c,&d);  
          price=-1;  
          go(0,0,0);  
          output();  
  }  
   
  不知道用官方数据测试结果会如何Top

20 楼mmmcd(超超)回复于 2006-06-02 09:15:08 得分 0

第三题,跟2004acm北京赛区网上预赛题Fourier's   Lines  
  http://acm.pku.edu.cn/JudgeOnline/problem?id=1923  
  几乎一样  
   
  把n人分若干组,比赛k场    
  <=>    
  n条直线,分成若干组平行线(不同组平行线必相交),构成交点k个  
   
  可以得出这样一个关系:  
   
  把n人分若干组,正好比赛k场  
  =>  
  先把n-r人分若干组,正好比赛k-r*(n-r)场  
  然后剩余r人分在同一组,他们跟前面的n-r人需要比赛r*(n-r)  
  (r=0,1,2,...,n且k>=0,k-r*(n-r)>=0)  
   
  可得关系式:  
                      1                                                                     k=0  
  f(n,k)   =     0                                                                     k<0  
                      max{   f(n-r,k-r*(n-r))|r=0,1,...,n}   k>0  
   
  f(n,k)=1则输出YES,否则NO  
   
  Top

21 楼mmmcd(超超)回复于 2006-06-02 09:21:49 得分 0

第五题确实可用用网络流算法解的  
   
  同样的题型在1998年acm上海赛区出现过,就是那道“梦之队”(Dream   Team)Top

22 楼chmsky(@)回复于 2006-06-02 09:43:24 得分 2

Mark  
  jfTop

23 楼sskset(断点)回复于 2006-06-02 11:05:10 得分 2

学习学习Top

24 楼joiny2000()回复于 2006-06-02 13:56:49 得分 2

MD,JFTop

25 楼davidbeckham23(小贝)回复于 2006-06-02 15:48:10 得分 2

mark!  
  做个记号   回家再做Top

26 楼lt1234(长空无云)回复于 2006-06-02 17:13:07 得分 2

mark!  
      做个记号   等会看!!!Top

27 楼weixing979(★★★闪电侠★★★)回复于 2006-06-02 17:37:08 得分 2

留个记号Top

28 楼Veiz(理论上存在)回复于 2006-06-02 23:04:12 得分 2

百度语言翻译机   用STL中的优先队列应该很快。  
  但是提交的这份代码一分未得,不知何故,请大家指点迷津,不胜感激!  
   
  #include   <string>  
  #include   <iostream>  
  #include   <fstream>  
  #include   <queue>  
   
  using   namespace   std;  
   
  struct   textMap  
  {  
          string   breviaryText;  
          string   originalText;  
  };  
   
  static   int   nMap;  
  static   string   text;  
   
  class   Compare  
  {       //比较类  
  public:  
          bool   operator()   (const   textMap&   c1,   const   textMap&   c2)   const  
          {  
                  return     (c1.breviaryText.size()   <   c2.breviaryText.size());  
          }  
  };  
   
  priority_queue<textMap,   vector<textMap>,   Compare>   priorityQueue;  
   
  void   stringReplace(string   &   str,   const   string&   des,   const   string&   src)    
  {  
          string::size_type   pos   =   0;  
          string::size_type   srclen   =   src.size();  
          string::size_type   deslen   =   des.size();  
          while((pos=str.find(src,   pos))   !=   string::npos)  
          {  
                      str.replace(pos,   srclen,   des);  
                      pos   +=   deslen;  
          }  
  }  
   
   
  int   main(int   argc,   char*   argv[])  
  {  
          ifstream   is(argv[1],   ios::in   |   ios::binary);  
          is   >>   nMap;  
          textMap   tempMap;  
          for(int   i   =   0;   i   <   nMap;   ++i)  
          {  
                  is   >>   tempMap.breviaryText;  
                  is   >>   tempMap.originalText;  
                  priorityQueue.push(tempMap);  
          }  
          is   >>   text;  
          for(int   i   =   0;   i   <   nMap;   ++i)  
          {  
                  tempMap   =   priorityQueue.top();  
                  priorityQueue.pop();  
                  stringReplace(text,   tempMap.originalText,   tempMap.breviaryText);                  
          }  
   
          cout   <<   text   <<   endl;  
          return   0;  
  }  
   
  Top

29 楼mmmcd(超超)回复于 2006-06-03 08:35:08 得分 0

“百度之星吧”将提供全部初赛测试数据  
  http://post.baidu.com/f?kw=%B0%D9%B6%C8%D6%AE%D0%C7Top

30 楼diaopeng(放飞自己)回复于 2006-06-03 10:32:08 得分 2

被骗了Top

31 楼Veiz(理论上存在)回复于 2006-06-03 13:16:23 得分 2

原来如此。   百度应该多给两个测试用例嘛。毕竟提交后无反馈信息。Top

32 楼ColdMoon0118(冷月葬花魂)回复于 2006-06-05 10:09:44 得分 2

markTop

33 楼galois_godel()回复于 2006-06-05 11:53:21 得分 2

第1题其实最不简单Top

34 楼oybee(oybee)回复于 2006-06-05 15:20:04 得分 2

有趣~Top

35 楼zidane_yubo(天涯独尊)回复于 2006-06-05 15:58:45 得分 2

mark!!!!!!!!!!!!!!!!Top

36 楼ceh1982()回复于 2006-06-05 17:29:46 得分 2

markTop

37 楼NC(比尔.盖饭)回复于 2006-06-05 18:53:33 得分 2

markTop

38 楼jp1984(mathfrog)回复于 2006-06-05 21:21:23 得分 0

to   galois_godel()    
  第一题有那么复杂吗?  
  充其量是一个类似字符串匹配的问题   ,   用dengsf说的硬算或者双向自动机都可以解决.  
  只不过代码量比较大而已.Top

39 楼liu103bing(爬虫)回复于 2006-06-05 22:08:12 得分 0

好Top

40 楼xuelong_zl(点雨点[我身上咋就没MM的香水味涅??#-_-])回复于 2006-06-06 09:56:53 得分 2

请问楼主这里复赛的题也包含了吗?Top

41 楼onlymilan(onlymilan)回复于 2006-06-06 12:49:41 得分 2

markTop

42 楼youzi520(釉子-MeChecksV)回复于 2006-06-06 17:41:09 得分 2

MARK!Top

43 楼yygyogfny(火鸟)回复于 2006-06-06 23:39:50 得分 2

mark!Top

44 楼mmmcd(超超)回复于 2006-06-08 08:28:48 得分 0

据一个进决赛的小伙说第三题的n,k上限都是500,  
  这就很好办了  
   
  #include   <stdio.h>  
  char   f[500][500];  
   
  int   solve(int   n,int   k)  
  {  
        int   r;  
        if(n<0   ||   k<0)return   -1;  
        if(f[n][k])return   f[n][k];  
        if(k==0){  
              return   f[n][k]=1;  
        }  
        f[n][k]=-1;  
        for(r=1;r<=n;r++)  
        {  
              if(k>=0)  
              {  
                    f[n][k]=solve(n-r,k-r*(n-r));  
                    if(f[n][k]==1)  
                    {  
                          return   1;  
                    }  
              }  
        }  
        return   f[n][k];  
  }  
  int   main(int   argc,   char*   argv[])  
  {  
        int   n,k;  
        FILE   *fin=fopen(argv[1],"r");  
        while(fscanf(fin,"%d   %d",&n,&k)==2){  
              if(solve(n,k)==1)printf("YES\n");  
              else   printf("NO\n");  
        }  
        return   0;  
  }  
  Top

45 楼mmmcd(超超)回复于 2006-06-08 08:29:25 得分 0

char   f[501][501];Top

46 楼feixiang1211(轻风细雨)回复于 2006-06-09 16:37:31 得分 2

mark.studyTop

47 楼mmmcd(超超)回复于 2006-06-12 21:29:45 得分 0

第5题,首先构造一个网络:  
  员工对应点集x,工作区对应点集y,  
  增加一个源点s,定义弧(s,xi)的   容量   为1,   费用   为0  
  增加一个汇点t,定义弧(yi,t)的   容量   为第i个工作区容纳的人数,   费用   为0  
        x集到y集的有向边(xi,yj)的   容量   为1,费用   是第i人在第j工作区内的喜好值。  
   
  求这个网络的最大费用最大流,就是总员工的最大喜好程度。Top

48 楼soholi(天涯孤棹)回复于 2006-06-26 13:01:22 得分 2

顶一下Top

49 楼sunnylyy()回复于 2006-06-26 15:12:16 得分 2

我不会网络流算法,当时时间紧迫,用贪心法做的第5题,得了一半的分。Top

50 楼CsdnPlayer()回复于 2006-06-26 23:20:08 得分 2

MKTop

51 楼zhangchaokun(lywin)回复于 2006-06-28 09:36:54 得分 2

这些题有意思,mark一下Top

52 楼woundedsoul(MissWolf)回复于 2006-06-29 22:44:18 得分 2

MAKR   考完期末就来研究Top

53 楼Zephyrzzz()回复于 2006-06-30 23:13:45 得分 2

第一题用字典树比较好,第五题用最大权匹配比最小费用流快,第六题并查集.Top

54 楼teacher1998(英语+asp.net+MsSQL)回复于 2006-07-04 01:40:52 得分 2

记下来Top

55 楼lifeng198387(李锋)回复于 2006-09-14 16:42:44 得分 2

printfTop

56 楼CrazyAnt_X()回复于 2006-09-15 17:11:57 得分 2

markupTop

57 楼kangji(尾鱼头)回复于 2006-09-16 21:28:37 得分 2

太长了,先MARKTop

58 楼real_name(*真名)回复于 2006-09-17 09:45:12 得分 2

UP,挺有意思Top

59 楼ilexyang()回复于 2006-09-23 18:28:27 得分 2

刚发现,顶一个Top

60 楼zpx833(抛物线833)回复于 2006-09-23 18:34:11 得分 2

爱死你了Top

61 楼ganthur()回复于 2006-09-24 22:11:19 得分 2

markTop

62 楼JXAUkevin()回复于 2006-09-27 08:44:09 得分 2

一题都做不出。。。。Top

63 楼bclz_vs(边城)回复于 2006-09-27 10:38:56 得分 2

markTop

64 楼laiwusheng(风清扬)回复于 2006-09-28 07:21:20 得分 2

markTop

65 楼williamwhy()回复于 2006-09-28 14:48:03 得分 2

第5提我的想发是:  
  左边是人,右边是区域,每个人和每个区域间都有路径,路径上的权值就是代表对这个区域的喜好分,因为要求最大分,所以把权值最小的去掉,条件是没个人的出度为1,没个区域的入度为NTop

66 楼goonmoon()回复于 2006-09-28 22:01:50 得分 2

 
  mark!  
      做个记号   等会看!!!  
   
  Top

67 楼zctom23(I love this language)回复于 2006-09-29 11:24:37 得分 2

mark,  
  以后细细研究下Top

68 楼flyingsnowy((欧杨)不远万里来看楼主的帖,这是一种什么样的精神病?)回复于 2006-09-29 13:45:47 得分 2

恭喜恭喜,接分。  
   
  Top

69 楼ysc918(白纸人生)回复于 2006-09-29 15:04:01 得分 2

同上。Top

70 楼wanglianghu(梦一回)回复于 2006-10-02 22:08:35 得分 2

up  
  Top

71 楼dylin(家住红灯区,市府前)回复于 2006-10-03 16:52:40 得分 2

mark   再看Top

72 楼dick248()回复于 2006-10-03 17:09:36 得分 2

markTop

73 楼heartbeast(星星的小孩)回复于 2006-10-03 21:42:06 得分 2

upTop

74 楼adintr(www.adintr.com)(风流总被雨打风吹去)回复于 2006-10-08 13:12:16 得分 2

MARKTop

75 楼scalapack()回复于 2006-10-12 10:29:42 得分 2

第一题   用python来做     其实相当于C里面的字典树  
   
  #!/usr/bin/env   python  
  #   coding:utf-8  
  #程序目的:  
  #       搜索关键字文件   然后将input文件中的关键字替换掉  
  #用到的方法:  
  #       将关键字保存在keyDict中,并且将保存一个lengthDict,其关键字为长度,值为该长度的所有的关键字的list  
  #       按读入文件一行进行循环,每次循环搜索最长长度的关键字列表,替换  
  #可能的问题:  
   
  import   sys,os  
  keyDict,lengthDict={},{}  
  keyFile=open(sys.argv[1],'r')  
  for   line   in   keyFile.readlines():  
          l=line.strip().split()  
          key,value=l[0],l[1]  
          keyDict[key]=value  
          if   len(key)   in   lengthDict.keys():  
                  pass  
          else:  
                  lengthDict[len(key)]=[]  
          lengthDict[len(key)].append(key)  
  keyFile.close()  
  inFile=open(sys.argv[2])  
  outFile=open('out.txt','w')  
  line=inFile.readline()  
  while   line:  
          lengthList=lengthDict.keys()  
          for   i   in   range(len(lengthList)):  
                  m=max(lengthList)  
                  lengthList.remove(m)  
                  for   j   in   lengthDict[m]:  
  #                       print   j,keyDict[j]  
  #                       print   line  
                          line=line.replace(j,keyDict[j])  
          outFile.write(line)  
          line=inFile.readline()  
  inFile.close()  
  outFile.close()  
  Top

76 楼scalapack()回复于 2006-10-12 10:31:17 得分 2

ft     怎么缩进全没了?     csdn怎么引用代码啊?Top

77 楼zjbirdman()回复于 2006-10-12 11:00:45 得分 2

markTop

78 楼hf1983()回复于 2006-10-12 14:53:50 得分 2

markTop

79 楼Leaveye(~枝)(男子无权便是钱)回复于 2006-10-16 18:56:54 得分 2

http://post.baidu.com/f?kz=66333145Top

80 楼chuan315()回复于 2006-10-17 13:24:24 得分 2

虽然花了一中午的时间只完成了第一题,但是感觉用java方便一些,因为里面有很多有用的方法  
   
   
  import   java.util.*;  
  import   java.io.*;  
  //定义一个公共输入类,方便输入  
  class   MyInput  
  {  
  public   static   String   readString()  
  {  
  BufferedReader   br=new   BufferedReader(  
  new   InputStreamReader(System.in),1);  
  String   s="";  
  try  
  {  
  s=br.readLine();  
  }  
  catch(IOException   e)  
  {  
  e.printStackTrace();  
  }  
  return   s;  
   
  }  
  public   static   int   readInt()  
  {  
  return   Integer.parseInt(readString());  
  }  
  }  
  class   Translate  
  {  
  int   N;  
  String[]   str;  
  String   text="";  
  //输入方法  
  void   input()  
  {  
  N=MyInput.readInt();  
  str=new   String[N];  
  for(int   i=0;i<N;i++)  
  {  
  str[i]=MyInput.readString();  
   
  }  
  text=MyInput.readString();  
  System.out.println();  
  }  
  //获取输入的缩略语  
  String   getWord(String   s)  
  {  
  String   word="";  
  StringTokenizer   st=new   StringTokenizer(s);  
  word=st.nextToken();  
  return   word;  
  }  
  //输出方法    
  void   output()  
  {  
  String[]   words=new   String[N];//存放缩略语的数组  
  String[]   names=new   String[N];//存放日常语言的数组  
  String   text1=new   String(text);//包含缩略语的相关文档  
  for(int   i=0;i<N;i++)  
  {  
  words[i]=getWord(str[i]);  
  names[i]=str[i].substring(words[i].length()+1,str[i].length());  
   
  }  
  /*将获取的缩略语数组用冒泡法按长度由长到短排序,使输入时先替换长的缩略语,  
        避免出现输入(p   我,pd   他,   pd)   时输出结果为(我d)而不是(他)的情况*/    
  for(int   i=0;i<N;i++)  
          for(int   j=N-1;j>i;j--)  
          {  
  if(words[j].length()>words[j-1].length())  
  {  
  String   t=words[j-1];words[j-1]=words[j];words[j]=t;  
  String   m=names[j-1];names[j-1]=names[j];names[j]=m;  
  }  
                            }  
  //替换缩略语  
  for(int   i=0;i<N;i++)  
  {  
  text1=text1.replaceAll(words[i],names[i]);  
  }  
  System.out.println(text1);  
  }  
  public   static   void   main(String[]   args)  
  {  
  Translate   t=new   Translate();  
  t.input();  
  t.output();  
  }    
  }  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  Top

81 楼scalapack()回复于 2006-10-19 22:43:28 得分 2

楼上的怎么运行啊    
  输入什么参数?Top

82 楼scalapack()回复于 2006-10-20 11:29:22 得分 2

需要从文件读入数据,楼上的java需要改进Top

83 楼seadaughter(我喜欢月亮,温柔、博大,寒冷的温暖)回复于 2006-10-20 11:52:18 得分 2

reTop

84 楼Godlikeme(我们所要做的不仅仅是抵制日货)回复于 2006-10-20 15:55:39 得分 2

markTop

85 楼chuan315()回复于 2006-10-20 22:39:01 得分 2

6  
  PS   门户搜索部  
  NLP   自然语言处理  
  PM   产品市场部  
  HR   人力资源部  
  PMD   产品推广部  
  MD   市场发展部  
  百度的部门包括PS,PM,HR,PMD,MD等等,其中PS还包括NLP小组。  
  难道他的要求不是照上面这样输入吗??  
  还是要导入它指定的方件???  
  我上面编的java就是按上面这样的格式输入的,具体内容可以改变Top

86 楼scalapack()回复于 2006-10-23 10:29:48 得分 2

这不可能。肯定是要从文件输入  
  对于要进行替换的文档,题目说不超过1000000个字节。Top

87 楼shengli_liao(我是谁?)回复于 2006-10-23 11:15:03 得分 2

ljTop

88 楼malvaceous()回复于 2006-10-23 17:03:06 得分 2

我觉得第一题很有些麻烦啊  
  如果输入的文档不够规范怎么办呢?  
  例如部门为CP、PHHD、HHD  
  我的输入文档非要写成CP\P   HHD+HHD,这个处理怎么办?还有其他的分割方式在内  
  如果考虑这些,难度根本不在字典树,而在于怎么做语言分词了  
  Top

89 楼zx4517(watermelon)回复于 2006-10-24 14:54:48 得分 2

MM算法Top

90 楼zx4517(watermelon)回复于 2006-10-24 14:58:10 得分 0

第一题用MM算法,已经用java实现。  
  因为我以前看过中文分词的一些资料,所以熟悉这个算法。我觉得这道题看似简单,其实还是有些技巧在里面的。  
  第二题解题思路:  
  计算出所有点菜的可能,然后为每种可能打分。分数最高的为最优。  
  大家说说这个思路行不?还有什么其他的好方法?Top

91 楼malvaceous()回复于 2006-10-24 16:58:42 得分 2

MM算法……  
  幸亏只是英文大写字母……Top

92 楼shareyao()回复于 2006-11-05 17:17:24 得分 2

mark!Top

93 楼snow_wolf_lake()回复于 2006-11-05 21:11:59 得分 2

什么是MM算法?Top

94 楼tianchai12321(天拆)回复于 2006-11-06 18:17:17 得分 2

markTop

95 楼xdspower(杂食菜熊)回复于 2006-11-06 23:37:24 得分 2

第一题其实不简单的,较正统的方法就是构造字典(哈希表),再逐次搜索替换,但这样的效率可能不是最高,有两个十分耗费资源的过程,构造字典,和逐次搜索。不过"仅包含大写英文字符,长度不超过10字节,只包括日常用语"条件其实保证了日常用语中不再出现扩展,这也是另外一条策略实施的重要条件,这样可以不用构造字典,而是构造单向数据链表,定词搜索(最多N轮)替换,最后整合链表输出就可以了。  
  链表节点结构是  
  {  
  下节点地址;  
  是否再搜索标志——可以扩展为指定数组位置标记  
  数据长度;  
  内容;  
  }  
  这样没一条就是对链表中内容搜索匹配,在匹配处断开形成3个新的节点,一个是前部分,一个是匹配点(内容用实际内容,或者数组位置标记,并标记是否再搜索标志),一个是后部分,直到末尾,以词条循环,同时构造日常用语数组。  
  为了优化,还可以动态检测是否所有节点已经不需要搜索,从而更早的结束,实现机制是用一个指针变量指定变化的起始搜索节点,如果该节点已到末尾,就停止搜索了。  
  输出就是一般的输出,最多就是数组定位了。  
  这样的空间要求和时间要求都相对比较合理的。Top

96 楼xmxoxo(xmxoxo)回复于 2006-11-07 12:34:09 得分 2

关注Top

97 楼yejun307()回复于 2006-11-13 21:16:39 得分 2

看来我的水平不够矣!Top

98 楼dbwang()回复于 2006-11-26 15:21:08 得分 2

怎么报名  
  Top

99 楼duanyong2004()回复于 2006-11-27 23:38:53 得分 2

哎,各位DX太牛了,我一道也不会!!!!Top

100 楼snow_kit(最近想象力枯竭)回复于 2006-12-12 19:06:54 得分 2

mark   从明天起   一天研究一个   嘿嘿Top

101 楼snow_kit(最近想象力枯竭)回复于 2006-12-13 09:40:17 得分 2

第1题   思路:  
   
            1.读入   in.txt   文件   将前面的表达式   以树形结构(利用缩写字母数来决定树的深度)    
            2.读入   in.txt   文件   中的最后那句   语句   以链表的形式   存储  
            3.遍历链表   替换……  
  Top

102 楼AloneSword(孤剑)回复于 2006-12-13 10:40:55 得分 2

markTop

103 楼wonxlei(Linkin Park & Jay-Z)回复于 2006-12-13 14:25:03 得分 2

dinging..............Top

104 楼vinck()回复于 2006-12-14 16:51:04 得分 2

要学习啊!!!Top

105 楼hnlzpsh(非学无以广才 非志无以成学)回复于 2006-12-20 18:03:57 得分 2

作个记号Top

106 楼lsk_30516()回复于 2006-12-20 18:12:17 得分 2

markTop

107 楼Jamesonang(珍惜生命,远离网络)回复于 2006-12-20 21:12:43 得分 2

同 markTop

108 楼mybaby999(如水江南)回复于 2006-12-21 23:35:13 得分 2

逻辑上不是很难  
  实现起来啰嗦  
  事务处理的算法就是这样  
  没有太多技巧性,也没有太多高深的东西  
   
  就是啰嗦  
  Top

109 楼ecchi()回复于 2006-12-26 12:19:53 得分 2

第一题hash的话应该能过.Top

110 楼sw1024()回复于 2006-12-26 12:50:12 得分 2

mark  
  数据结构算白学了Top

111 楼litaoye()回复于 2006-12-28 01:48:38 得分 2

看得真费劲,第一次看下来,只对第3题比较感兴趣。有空我也给个答案。Top

112 楼mlwu3(wml)回复于 2006-12-28 09:16:19 得分 2

markTop

113 楼llmsn("若虚"即"虚怀若谷"!!!)回复于 2006-12-28 11:12:56 得分 2

第一题用STL的MAP不知道怎么样?  
  Top

114 楼hun_kou_fan_chi()回复于 2006-12-30 22:42:35 得分 2

学习Top

115 楼iu_81(黄云万里动风色,白波九道流雪山。)回复于 2007-01-11 15:02:38 得分 2

得学习了Top

116 楼wang430903(味觉全无)回复于 2007-01-11 15:08:58 得分 2

记号Top

117 楼jx4245(HappyBoy)回复于 2007-01-11 21:06:20 得分 2

说说我对第5题的看法吧2~!  
  我对比较复杂的数据结构不太熟哈,只说说我对这题的一点大体想法。  
  第一步:  
    根据题意的,那把N   个区域,先分成两个区域来看   1。。。N-1,和   第N   个区域,   居题意得出条件1:  
  第N个区域中的   任何元素   X   和另一个假设合并的区域任意调换的话,不应该出现总分的增加的,所以可以这样去构成第N   个区域。  
   
  第N区域知道了,那就必须去构成1,。。。,N-1的区域。   这里都是一个递归了哈~~  
   
  第二步:  
   
  现在最主要的问题怎么去构成第N个区域了。  
   
  也就是求,所有人的集合   有哪些元素是属于   第N个区域。  
   
  对所有集合元素,分别判断是否属于N区域。  
   
  那怎样来判断的呢!例如集合中元素X。(还是根据上面的那个条件1来判断)  
   
  现在我们假设暂时把元素X保留下,默认它在第N个区域,也就是将元素X从所有人删除得到集合A,再把第N个区域的大小-   1   ,以此为条件,找到一个分配方法使总分最高(又是原题的递归),然后得出分配方法后,再将元素X和其它的区域的每个位置上的元素进行试探调换,看是否使总分增加,如果不会的话,就得出元素X   是属于   第N个区域的结论。  
   
  我们对所有这些元素进行判断的话,就可以得出第N区域了!  
   
  第三步:  
  重复   前两步   ,只是条件变为:集合B   =   所有人集合   -   属于第N个区域集合   和   第1。。。。N-1个区域为条件,递归求出这时的分配方法。  
   
  整个就是一个递归!!!  
   
  以上是我的思路。  
   
  请大家帮我看下逻辑上是否有错误哈~谢谢!~  
  Top

118 楼kinkoyo()回复于 2007-01-12 12:55:38 得分 0

跟ACM题目巨象Top

119 楼szlhj()回复于 2007-01-20 21:49:47 得分 0

近日较闲,解题为乐,觉得第三题有点兴趣,希望各位高人指点指点  
  解题思路:  
  设a[n]表示一种分组,其中a[i]为第i组人数,并可令a[1]>=a[2]>=...>=a[n],a[i]>=0;  
  则对任一分组a[],比赛场数=C(n,2)-(   C(a[1],2)+...+C(a[n],2)   )  
  其中C(a[i],2)是a[i]中任取2的组合数,也即数学上"C"  
  (   C(a[1],2)+...+C(a[n],2)   )   为因分组而损失的比赛场数  
  这样,只要找到所有可能的分组,并算出其组合数,就可以得所有可能k值  
  怎样枚举所有可能的分组:  
  考察n=4,所有可能的分组可表示为:  
  4,[0]  
  3,[1]   三人在第一组,其余再分组  
  2,[2]  
  1,[3]  
  其中[i]表示i个人的所有分组可能,显然是个递归.  
   
  class   baidu3{  
      public   static   int   N;  
      public   static   int   CN;     //   最大比赛场数  
      public   static   StringBuffer   sb;  
       
      public   static   void   main(String   args[]){  
          int   n=Integer.valueOf(args[0]);  
          int   k=Integer.valueOf(args[1]);  
          int   a[]=new   int[n];  
          sb=new   StringBuffer("");  
          N=n;  
          CN=n*(n-1)/2;  
      AllSort(a,n,k);  
      if   (sb.length()>0){  
          System.out.println(String.valueOf(n)+","+String.valueOf(k)+":   YES");  
          System.out.print("分组:"+sb.toString());  
      }          
          else  
              System.out.println(String.valueOf(n)+","+String.valueOf(k)+":   NO");  
      }  
      //   获取数组实际使用  
      public   static   int   getAUsedLen(int[]   a){  
          int   i;  
          for(i=0;i<a.length;i++)  
              if   (a[i]==0)  
                  break;  
          return   ((i==a.length)?a.length:i);  
      }  
      //   a[i]>=a[i+1]  
      public   static   boolean   isValid(int[]   a,int   next){          
              if   (getAUsedLen(a)==0)  
                  return   true;  
          return   a[getAUsedLen(a)-1]>=next;  
      }  
      //   计算分组a少进行的比赛数  
      public   static   int   CalK(int[]   a){  
          int   count=0;  
          for(int   i=0;i<getAUsedLen(a);i++){  
              if   (a[i]!=1)  
                  count+=a[i]*(a[i]-1)/2;  
          }  
          return   count;  
      }  
      //   枚举所有分组,计算可能k值  
      public   static   void   AllSort(int[]   a,int   n,int   k){  
          if   (n==0){  
              if   (CN-CalK(a)==k){  
                  sb.append("(");  
              for(int   i=0;i<getAUsedLen(a);i++){  
                  sb.append(a[i]);  
                  sb.append("   ");  
              }  
              sb.setLength(sb.length()-1);  
              sb.append(")");  
              }  
          }  
          for(int   i=0;i<n;i++){  
              if   (isValid(a,n-i)){  
                  a[getAUsedLen(a)-1+1]=n-i;  
              AllSort(a,i,k);          
              a[getAUsedLen(a)-1]=0;  
              }  
          }  
      }  
  }Top

120 楼szlhj()回复于 2007-01-20 21:53:24 得分 0

测试:  
  java   baidu3   10   22>  
  10   22:NO  
   
  java   baidu3   10   23>  
  10,23:   YES  
  分组:(7   2   1)  
   
  java   baidu3   10   33>  
  10,33:   YES  
  分组:(5   2   2   1)(4   4   1   1)(4   3   3)   其中每个括号为一种分组方法  
   
   
   
   
  Top

121 楼itegel84()回复于 2007-01-21 18:40:41 得分 0

markTop

122 楼shan_ghost()回复于 2007-01-22 12:44:08 得分 0

markTop

123 楼prince0071()回复于 2007-02-03 16:55:28 得分 0

szlhj   的算法基础挺不错的啊!呵呵Top

124 楼heiheihahahei(我操,难道错了?)回复于 2007-02-04 23:06:30 得分 0

第一题搜索的时候是不是可以找"pm+空格","pmd+空格"呢?Top

125 楼zhenyucheung()回复于 2007-02-25 17:09:00 得分 0

markTop

126 楼churchatp1(别看资料,看聊效!)回复于 2007-02-28 17:17:56 得分 0

markTop

127 楼yyzhao21()回复于 2007-03-02 09:48:47 得分 0

markTop

128 楼iceman923(影枫)回复于 2007-03-03 02:13:40 得分 0

markTop

129 楼chenqiu1024(FutureBoy)回复于 2007-03-07 21:22:37 得分 0

今天才看到这个大赛题目.   蝈蝈记分那题想了很长时间怎样提高速度.   后来看了别人的回复才想到X的个数是有限的这个隐含条件.  
   
  不过一场比赛中最多会有20个X,那么要简单地搜也有2的20次方(比1000*1000)还大.   测试用例包含的数据很多时好像运行时间也保证不了吧?Top

130 楼rainbowsoftware(学无止境)回复于 2007-04-20 16:04:07 得分 0

作个记号Top

131 楼HolpFalcon()回复于 2007-04-20 22:45:43 得分 0

看了下题目,无比的像ACM的试题……只是过是中文的,程序的基本样本如果过了但是却挂了,说明还是有一些没考虑到的情况在比如超界之类的Top

132 楼rongcanf(沉默是猪。)回复于 2007-04-21 22:16:19 得分 0

markTop

133 楼rover___()回复于 2007-04-22 17:30:15 得分 0

第一题:我考虑先进行排序,将缩略语对照表按照字典排序,然后进行顺序替换。Top

134 楼jianjun2()回复于 2007-04-24 12:43:20 得分 0

值得学习Top

相关问题

关键词

得分解答快速导航

  • 帖主:mmmcd
  • cestar2005
  • hchf_1
  • jp1984
  • haozi8123
  • sinall
  • stonepeter
  • weimj
  • weimj
  • dengsf
  • DraculaW
  • chjpeng
  • chmsky
  • sskset
  • joiny2000
  • davidbeckham23
  • lt1234
  • weixing979
  • Veiz
  • diaopeng
  • Veiz
  • ColdMoon0118
  • galois_godel
  • oybee
  • zidane_yubo
  • ceh1982
  • NC
  • xuelong_zl
  • onlymilan
  • youzi520
  • yygyogfny
  • feixiang1211
  • soholi
  • sunnylyy
  • CsdnPlayer
  • zhangchaokun
  • woundedsoul
  • Zephyrzzz
  • teacher1998
  • lifeng198387
  • CrazyAnt_X
  • kangji
  • real_name
  • ilexyang
  • zpx833
  • ganthur
  • JXAUkevin
  • bclz_vs
  • laiwusheng
  • williamwhy
  • goonmoon
  • zctom23
  • flyingsnowy
  • ysc918
  • wanglianghu
  • dylin
  • dick248
  • heartbeast
  • adintr
  • scalapack
  • scalapack
  • zjbirdman
  • hf1983
  • Leaveye
  • chuan315
  • scalapack
  • scalapack
  • seadaughter
  • Godlikeme
  • chuan315
  • scalapack
  • shengli_liao
  • malvaceous
  • zx4517
  • malvaceous
  • shareyao
  • snow_wolf_lake
  • tianchai12321
  • xdspower
  • xmxoxo
  • yejun307
  • dbwang
  • duanyong2004
  • snow_kit
  • snow_kit
  • AloneSword
  • wonxlei
  • vinck
  • hnlzpsh
  • lsk_30516
  • Jamesonang
  • mybaby999
  • ecchi
  • sw1024
  • litaoye
  • mlwu3
  • llmsn
  • hun_kou_fan_chi
  • iu_81
  • wang430903
  • jx4245

相关链接

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

广告也精彩

反馈

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