好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

2012百度之星资格赛试题与AC代码合集

2012百度之星资格赛试题与AC代码合集

百度文库下载地址: http://wenku.baidu.com/view/39d92648852458fb770b5616.html 2012百度之星资格赛试题与AC代码

A:百度计算器的加法

时间限制: 1000ms 内存限制: 10000kB

描述
百度框计算中提供了计算器这个功能,模拟计算器中的复杂功能,我们最先需要解决的就是实现加法模块。今天就给你个机会,和百度计算器一样,计算一下十以内的加法吧。

输入
仅有一组数据,包含两个正整数,分别为a, b(0 <= a, b <= 10)

输出
一个正整数,暨输入a, b后对应的a+b的计算结果

  1  #include <stdio.h>
  2  
  3  #include <stdlib.h>
  4  
  5   /* 
  6  
  7   author tilltheendwjx
   8  
  9   blog     http://blog.csdn.net/wjh200821  或者http://www.cnblogs.com/tilltheendwjx/
  10  
 11   */ 
 12  
 13   int   main()
  14  
 15   {
  16  
 17       int   a,b;
  18  
 19      scanf( "  %d%d  " ,&a,& b);
  20  
 21      printf( "  %d  " ,a+ b);
  22  
 23      //  system("pause"); 
 24  
 25       return   0  ;  
  26  
 27  }

B:小诺爱USB设备

时间限制: 1000ms 内存限制: 65536kB

描述
在百度工作的小诺是一个USB设备迷,在他桌上有一堆的USB设备——USB鼠标、USB小音箱、USB按摩器……但是,公司配给小诺的ThinkPad X系列的电脑只有一个能用的USB接口。不过还好,小诺有一堆的USB Hub,可以把一个可用的USB接口变成多个USB接口。但是,小诺很难确定这些USB Hub能否满足他他众多的USB设备的需求。

输入
输入首行包括一个整数N(1 ≤ N ≤ 20),表示测试数据组数。接下去的N行,每行包括一组测试数据。每组测试数据行以一个整数K开头(1 ≤ K ≤ 10),表示这组测试数据提供的USB Hub的数量;紧接着,在同一行,有K个整数(每两个整数之间由一个空格分隔开),{M1,M2…Mi…MK}(2 ≤ Mi ≤ 10),每个整数表示了这个USB Hub能将一个USB接口数变成的多个USB接口的数量。

输出
针对每组测试数据输出一个结果,表示小诺用这组提供的USB Hub后,能最多使用的USB设备的数量。每个输出占一行。

  1  #include <iostream>
  2  
  3   using   namespace   std;
   4  
  5   /* 
  6  
  7   author tilltheendwjx
   8  
  9   blog     http://blog.csdn.net/wjh200821  或者http://www.cnblogs.com/tilltheendwjx/
  10  
 11   */ 
 12  
 13   int   main()
  14  
 15   {
  16  
 17       int   n;
  18  
 19      cin>> n;
  20  
 21       int   k;
  22  
 23       int  * a;
  24  
 25       int  *b= new   int  [n];
  26  
 27       for ( int  i= 0 ;i<n;i++ )
  28  
 29       {
  30  
 31         cin>> k;
  32  
 33         a= new   int  [k];
  34  
 35          int  sum= 0  ;
  36  
 37          for ( int  j= 0 ;j<k;j++ )
  38  
 39          {
  40  
 41                 cin>> a[j];
  42  
 43                 sum+= a[j];
  44  
 45          }
  46  
 47         b[i]=sum+ 1 - k;
  48  
 49       }
  50  
 51       for ( int  i= 0 ;i<n;i++ )
  52  
 53       {
  54  
 55        
 56  
 57         cout<<b[i]<< endl;
  58  
 59       }
  60  
 61       delete a;
  62  
 63      //  system("pause"); 
 64  
 65      return   0  ;   
  66  
 67  }

C:易手机的套餐

时间限制: 1000ms 内存限制: 10000kB

描述
装载百度易平台的易手机已经上市,为了更好的为大家提供服务。百度与合作的运营商正在讨论为易手机用户推出一款特别的套餐,帮助大家更好的利用易手机。作为这个项目负责人的晓萌调研了大量用户使用这个套餐后会出现的资费预估,让我们来看看这个特别的套餐到底会带来怎样资费情况吧。

输入
输入数据包括十二行,每行包括一个数字(不含金钱符号$),表示晓萌调研的某一用户使用特别套餐后,一月到十二月消费的资费情况。每行包括的这个数字精确到小数点后两位。

输出
输出仅一行,表示用户使用该套餐后,针对给出的12个月的资费的均值情况。在分位采用四舍五入进位。输出以金钱符号$开头,输出中不含空格等其它特别字符。

  1  #include <stdio.h>
  2  
  3  #include <stdlib.h>
  4  
  5  #include <math.h>
  6  
  7   /* 
  8  
  9   author tilltheendwjx
  10  
 11   blog     http://blog.csdn.net/wjh200821  或者http://www.cnblogs.com/tilltheendwjx/
  12  
 13   */ 
 14  
 15   int   main()
  16  
 17   {
  18  
 19      float  a[ 12  ];
  20  
 21      float  avg= 0  ;
  22  
 23      int  i= 0  ;
  24  
 25      for (i= 0 ;i< 2 ;i++ )
  26  
 27      {
  28  
 29        a[i]= 0.00  ;
  30  
 31      }
  32  
 33      for (i= 0 ;i< 12 ;i++ )
  34  
 35      {
  36  
 37        scanf( "  %f  " ,& a[i]);
  38  
 39        avg=avg+ a[i];
  40  
 41      }
  42  
 43     printf( "  $%.2f  " ,( float )(avg/ 12  ));
  44  
 45      //  system("pause"); 
 46  
 47      return   0  ;  
  48  
 49  }

D:共同狂欢

时间限制: 1000ms 内存限制: 131072kB

描述
百度2005年8月5日上市时,在北京和纳斯达克的同学们每一个小时整点时就会通一次电话,对一下表,确认一切相关活动都精确同步。但是要注意,在两边的同学位于不同的时区,在夏时制时,两地时差12小时,因此,每次对表都需要做一下时区转换。你来帮我们完成这个有点麻烦的工作吧。

输入
输入的第一行包括一个整数T(T ≤ 30),表示测试数据的组数;接下去的T行每行包括一个时间,表示两地中的一个地方同学报出的整点的时间,表示成“H:M”的形式,其中H是小时(0 ≤ H < 24,且当H小于10的时候可以表示成1位或者2位的形式)、M是分钟(0 ≤ M < 60,且当M小于10的时候可以表示成1位或者2位)。

输出
每个测试数据输出一行,当是整点对时时,输出时区转换后的小时结果;当不是整点对时时,输出0。

  1  #include <stdio.h>
  2  
  3  #include <stdlib.h>
  4  
  5   /* 
  6  
  7   author tilltheendwjx
   8  
  9   blog     http://blog.csdn.net/wjh200821  或者http://www.cnblogs.com/tilltheendwjx/
  10  
 11   */ 
 12  
 13   int   main()
  14  
 15   {
  16  
 17      int   n;
  18  
 19      int  * a;
  20  
 21      int  * b;
  22  
 23      int  * c;
  24  
 25      int  i= 0  ;
  26  
 27     scanf( "  %d  " ,& n);
  28  
 29     a=( int  *)malloc( sizeof ( int )* n);
  30  
 31     b=( int  *)malloc( sizeof ( int )* n);
  32  
 33     c=( int  *)malloc( sizeof ( int )* n);
  34  
 35      for (i= 0 ;i<n;i++ )
  36  
 37      {
  38  
 39         scanf( "  %d:%d  " ,&a[i],& b[i]);
  40  
 41          if (b[i]!= 0  )
  42  
 43         { c[i]= 0  ;}
  44  
 45          else 
 46  
 47          {
  48  
 49              if ((a[i]+ 12 )== 24  )
  50  
 51                c[i]= 24  ;
  52  
 53              else 
 54  
 55                c[i]=(a[i]+ 12 )% 24  ;
  56  
 57          }
  58  
 59         
 60  
 61      }
  62  
 63      for (i= 0 ;i<n;i++ )
  64  
 65      {
  66  
 67         printf( "  %d\n  "  ,c[i]);
  68  
 69         
 70  
 71      }
  72  
 73      free(a);
  74  
 75      free(b);
  76  
 77      free(c);
  78  
 79      //  system("pause"); 
 80  
 81      return   0  ;  
  82  
 83  }

E:C++ 与Java

时间限制: 2000ms 内存限制: 65536kB

描述
在百度之星的贴吧里面,Java的爱好者和C++的爱好者总是能为这两种语言哪个更好争论上几个小时。Java的爱好者会说他们的程序更加整洁且不易出错。C++的爱好者则会嘲笑Java程序很慢而且代码很长。
另一个Java和C++爱好者不能达成一致的争论点就是命名问题。在Java中一个多个单词构成的变量名应该按照如下格式命名:第一个单词的开头用小写字母,其余单词都以大写字母开头,单词与单词之间不加分隔符,除单词的首字母之外的字母一律使用小写。例如:javaIdentifier, longAndMnemonicIdentifier, name, bAIDU.
与Java不同C++的命名全都使用小写字母,在单词和单词之间使用“_”来作为分隔符。例如:c_identifier, long_and_mnemonic_identifier, name (当名字中只有一个单词的时候,Java与C++的命名是相同的), b_a_i_d_u.
你的任务就是写一个程序能让C++和Java程序相互转化。当然转换完成的程序中的变量名也要符合其语言的命名规则,否则的话是不会有人喜欢你的转换器的。
首先你要做的就是写一个变量名转换器。给出一个变量名,你要先检测是Java的还是C++的,然后把它转化为另一种命名格式。如果两种都不是,那么你的程序就要报错。转换过程必须保持原有的单词顺序,只能改变字母的大小写和增加或删除下划线。

输入
输入有且仅有一行,是一个变量名,其中包含字母和下划线,长度不超过100。

输出
如果输入的是Java变量名那么输出它对应的C++形式。如果是C++的则输出对应的Java的形式。如果两种都不是就输出“Error!”。

样例输入
输入样例1:
long_and_mnemonic_identifier
输入样例2:
anotherExample
输入样例3:
i
输入样例4:
bad_Style

样例输出
输出样例1:
longAndMnemonicIdentifier
输出样例2:
another_example
输出样例3:
i
输出样例4:
Error!

   1  #include <stdio.h>
   2  
   3  #include <stdlib.h>
   4  
   5  #include <math.h>
   6  
   7  #include < string .h>
   8  
   9  #include <ctype.h>
  10  
  11   /* 
  12  
  13   author tilltheendwjx
   14  
  15   blog     http://blog.csdn.net/wjh200821  或者http://www.cnblogs.com/tilltheendwjx/
   16  
  17   */ 
  18  
  19   int   main()
   20  
  21   {
   22  
  23      char  a[ 100  ];
   24  
  25      char  b[ 100  ];
   26  
  27      int  i= 0  ;
   28  
  29      int  j= 0  ;
   30  
  31      int  flag= 0  ;
   32  
  33      int  javature= 0  ;
   34  
  35      int  cture= 0  ;
   36  
  37     scanf( "  %s  "  ,a);
   38  
  39      for (i= 0 ;i< 100 ;i++ )
   40  
  41      {
   42  
  43          if (a[i]== '  \0  '  )
   44  
  45            break  ;
   46  
  47          if (a[i]== '  _  '  )
   48  
  49          {
   50  
  51             if ((islower(a[i+ 1 ])== 0 )||i== 0 ||a[i+ 1 ]== '  \0  '  )
   52  
  53               flag= 1  ;
   54  
  55             else 
  56  
  57               cture= 1  ;
   58  
  59            i++ ;
   60  
  61            b[j]=( char  )toupper(a[i]);
   62  
  63            j++ ;
   64  
  65          }
   66  
  67          else   if ((isupper(a[i])!= 0  ))
   68  
  69          {
   70  
  71             if ((a[i- 1 ]== '  _  ' )||i== 0  )
   72  
  73              flag= 1  ;
   74  
  75             else 
  76  
  77              javature= 1  ;
   78  
  79            b[j]= '  _  '  ;
   80  
  81            j++ ;
   82  
  83            b[j]=( char  )tolower(a[i]);
   84  
  85            j++ ;
   86  
  87          }
   88  
  89          else 
  90  
  91          {
   92  
  93             b[j]= a[i];
   94  
  95             j++ ;
   96  
  97          }
   98  
  99          
 100  
 101      }
  102  
 103     b[j]= '  \0  '  ;
  104  
 105      if (flag== 0  )
  106  
 107      {
  108  
 109         if (javature== 1 &&cture== 1  )
  110  
 111           printf( "  Error!  "  );
  112  
 113         else 
 114  
 115           printf( "  %s  "  ,b);
  116  
 117      }
  118  
 119      else 
 120  
 121         printf( "  Error!  "  );
  122  
 123      //  system("pause"); 
 124  
 125      return   0  ;  
  126  
 127  }

F:百科蝌蚪团

时间限制: 1000ms 内存限制: 65536kB

描述
百度百科有一支神奇的队伍,他们叫自己“百科蝌蚪团”。为了更好的让蝌蚪团的成员们安排工作,百度百科的运营团队定出了一个24小时制的时间表。例如:
1. 每个蝌蚪团成员工作时长相同;
2. 必须安排蝌蚪团成员在他们方便的时间段工作;
3. 蝌蚪团成员安排时间最小安排时间节点(开始工作或停止工作)为半小时,比如04:00或04:30,而不是04:15;
4. 蝌蚪团成员一天在百度百科工作的时间是有上限的,他们会根据自己的情况给出上限。
5. 在特定时间段内必须有一定数量的蝌蚪团成员工作,以保证百度百科不断的进步
请帮运营团队计算一下,能保持24小时稳定在岗的蝌蚪团最少成员的数量。如果有2个蝌蚪团成员工作结束,同时另2个蝌蚪团成员开始工作,这段时间都算有2各成员稳定在岗。

输入
输入有多组,每组测试数据以一个整数N开头(1 ≤ N ≤ 50),表示蝌蚪团的成员数。紧接着,我们会有N个数据块,每一个数据块对应了一名蝌蚪团成员的日程情况。
每个数据块以两个整数开始,分别为K(1 ≤ K ≤ 50)和M(1 ≤ M ≤ 1440),用空格隔开。K表示这个数据块对应蝌蚪团成员方便的时间段的数量,M表示这个成员愿意每天在百度百科工作的最长分钟数。接下去的K行中,每行包括两个时间,分别表示成“HH:MM”的格式,以空格分隔,分别对应了该蝌蚪团成员一个方便的时间段的开始时间、结束时间;例如09:00 10:00表明他在早上九点到十点的时间段是方便的,可以在百度百科工作。如果两个时间相同,则说明这个他全天都是方便的。
最后一组数据的N为0,表示输入结束。

输出
对于每组数据,输出为一个整数,占一行。表示能保持24小时稳定在岗的蝌蚪团最少成员的数量。

   1   #include<stdio.h>
   2  
   3   #include<memory.h>
   4  
   5   #include<stdlib.h>
   6  
   7    #define  maxn 102
   8  
   9     int   d[maxn],g[maxn][maxn],f[maxn][maxn],pre[maxn],map[maxn][maxn],sum[maxn],current[maxn];
   10  
  11     int   n,m,num,mm;
   12  
  13     struct   node
   14  
  15    {
   16  
  17        int   x,y;
   18  
  19   }seg[ 1000 ],time[ 1000  ];
   20  
  21     #define  oo 0xfffffff
  22  
  23     int  cmp( const   void  *a, const   void  * b)
   24  
  25    {
   26  
  27        struct  node *va=( struct  node* )a;
   28  
  29        struct  node *vb=( struct  node* )b;
   30  
  31        return  va->x-vb-> x;
   32  
  33    }
   34  
  35     void  rev_bfs( int   t)
   36  
  37    {
   38  
  39        int   queue[maxn],flag[maxn];
   40  
  41        int   head,tail,i;
   42  
  43       memset(sum, 0 , sizeof  (sum));
   44  
  45        for  (i= 0 ;i<=n+ 49 ;i++ )
   46  
  47        {
   48  
  49           d[i]=n+ 49  ;
   50  
  51           sum[n+ 49 ]++ ;
   52  
  53        }
   54  
  55       sum[n+ 49 ]-- ;
   56  
  57       sum[ 0 ]++ ;
   58  
  59       d[t]= 0  ;
   60  
  61       queue[ 1 ]= t;
   62  
  63       flag[t]= 1  ;
   64  
  65       head= 1 ;tail= 1  ;
   66  
  67       memset(flag, 0 , sizeof  (flag));
   68  
  69        while  (head<= tail)
   70  
  71        {
   72  
  73            for  (i= 0 ;i<=n+ 49 ;i++ )
   74  
  75                if  (flag[i]== 0 &&g[i][queue[head]]> 0  )
   76  
  77                {
   78  
  79                   queue[++tail]= i;
   80  
  81                   d[i]=d[queue[head]]+ 1  ;
   82  
  83                   sum[n+ 49 ]-- ;
   84  
  85                   sum[d[i]]++ ;
   86  
  87                   flag[i]= 1  ;
   88  
  89                }
   90  
  91           head++ ;
   92  
  93        }
   94  
  95    }
   96  
  97     void  augment( int  s, int   t)
   98  
  99    {
  100  
 101        int   i,min;
  102  
 103       min= oo;
  104  
 105        for  (i=t;i!=s;i= pre[i])
  106  
 107             if  (g[pre[i]][i]< min)
  108  
 109               min= g[pre[i]][i];
  110  
 111        for  (i=t;i!=s;i= pre[i])
  112  
 113        {
  114  
 115           g[pre[i]][i]-= min;;
  116  
 117           g[i][pre[i]]+= min;
  118  
 119           f[pre[i]][i]+= min;
  120  
 121           f[i][pre[i]]-= min;
  122  
 123        }
  124  
 125    }
  126  
 127     int  retreat( int  *u, int   s)
  128  
 129    {
  130  
 131        int   v,min;
  132  
 133       min=n+ 49  ;
  134  
 135        for  (v= 0 ;v<=n+ 49 ;v++ )
  136  
 137            if  (g[*u][v]> 0 &&d[v]< min)
  138  
 139               min= d[v];
  140  
 141       sum[d[*u]]-- ;
  142  
 143        if  ((sum[d[*u]])== 0 &&d[*u]<=n+ 49 )  return   0  ;
  144  
 145       d[*u]=min+ 1  ;
  146  
 147       sum[d[*u]]++ ;
  148  
 149       current[*u]= 0  ;
  150  
 151        if  (*u!=s) *u=pre[* u];
  152  
 153        return   1  ;
  154  
 155    }
  156  
 157     void  ISAP( int  s, int   t)
  158  
 159    {
  160  
 161        int   u,v;
  162  
 163        rev_bfs(t);
  164  
 165       u= s;
  166  
 167        while  (d[s]<n+ 50  )
  168  
 169        {
  170  
 171            for  (v=current[u];v<=n+ 49 ;v++ )                                                                           
  172  
 173                if  (g[u][v]> 0 &&d[u]==d[v]+ 1  )
  174  
 175                    break  ;
  176  
 177            if  (v<=n+ 49  )
  178  
 179            {
  180  
 181               current[u]= v;
  182  
 183               pre[v]= u;
  184  
 185               u= v;
  186  
 187                if  (u== t)
  188  
 189                {
  190  
 191                    augment(s,t);
  192  
 193                   u= s;
  194  
 195                }
  196  
 197            }
  198  
 199            else   if  (retreat(&u,s)== 0 )  return  ;
  200  
 201        }
  202  
 203    }
  204  
 205    void   init()
  206  
 207    {
  208  
 209        int   i,j,a,b,c,d,min,t,k,ans,max,st,en,temp;
  210  
 211        while  (scanf( "  %d  " ,&n)!=EOF&& n)
  212  
 213        {
  214  
 215           memset(map, 0 , sizeof  (map));;
  216  
 217            for  (i= 1 ;i<=n;i++ )
  218  
 219            {
  220  
 221               scanf( "  %d%d  " ,&m,& t);
  222  
 223               map[ 48 ][i+ 48 ]=t/ 30  ;
  224  
 225               num= 0  ;
  226  
 227               mm= 0  ;
  228  
 229                for  (j= 1 ;j<=m;j++ )
  230  
 231                {
  232  
 233                   scanf( "  %d:%d %d:%d  " ,&a,&b,&c,& d);
  234  
 235                    if  (a==c&&b== d)
  236  
 237                    {
  238  
 239                        for  (k= 0 ;k< 48 ;k++ )
  240  
 241                           map[i+ 48 ][k]= 1  ;
  242  
 243                        continue  ;
  244  
 245                    }
  246  
 247                    if  (c== 0 &&d== 0  )
  248  
 249                    {
  250  
 251                       num++ ;
  252  
 253                       seg[num].x=a* 60 + b;
  254  
 255                       seg[num].y= 1440  ;
  256  
 257                    }
  258  
 259                    else   if  (a* 60 +b>c* 60 + d)
  260  
 261                    {
  262  
 263                       num++ ;
  264  
 265                       seg[num].x=a* 60 + b;
  266  
 267                       seg[num].y= 1440  ;
  268  
 269                       num++ ;
  270  
 271                       seg[num].x= 0  ;
  272  
 273                       seg[num].y=c* 60 + d;
  274  
 275                    }
  276  
 277                    else 
 278  
 279                    {
  280  
 281                       num++ ;
  282  
 283                       seg[num].x=a* 60 + b;
  284  
 285                       seg[num].y=c* 60 + d;
  286  
 287                    }
  288  
 289                }
  290  
 291                if  (num== 0 )  continue  ;
  292  
 293               qsort(seg+ 1 ,num, sizeof (seg[ 1  ]),cmp);
  294  
 295               st=seg[ 1 ].x;en=seg[ 1  ].y;
  296  
 297               seg[num+ 1 ].x= 1500 ;seg[num+ 1 ].y= 1600  ;
  298  
 299                for  (j= 2 ;j<=num+ 1 ;j++ )
  300  
 301                {
  302  
 303                   a= seg[j].x;
  304  
 305                   b= seg[j].y;
  306  
 307                    if  (st<=a&&a<=en&&en< b)
  308  
 309                       en= b;
  310  
 311                    else   if  (a> en)
  312  
 313                    {
  314  
 315                       mm++ ;
  316  
 317                       time[mm].x= st;
  318  
 319                       time[mm].y= en;
  320  
 321                       st= a;
  322  
 323                       en= b;
  324  
 325                    }
  326  
 327                }
  328  
 329                for  (j= 1 ;j<=mm;j++ )
  330  
 331                {
  332  
 333                   a=time[j].x/ 60  ;
  334  
 335                   b=time[j].x- 60 * a;
  336  
 337                   c=time[j].y/ 60  ;
  338  
 339                   d=time[j].y- 60 * c;
  340  
 341                    if  (a== c)
  342  
 343                    {
  344  
 345                        if  (b== 0 &&d>= 30  )
  346  
 347                           map[i+ 48 ][a* 2 ]= 1  ;
  348  
 349                    }
  350  
 351                    else 
 352  
 353                    {
  354  
 355                        if  (b> 0 &&b<= 30 ) b= 30  ;
  356  
 357                        if  (b> 30  )
  358  
 359                        {
  360  
 361                           a++ ;
  362  
 363                           b= 0  ;
  364  
 365                        }
  366  
 367                        if  (d< 30 ) d= 0  ;
  368  
 369                        if  (d> 30 ) d= 30  ;
  370  
 371                        while  (a!=c||b!= d)
  372  
 373                        {
  374  
 375                           map[i+ 48 ][a* 2 +b/ 30 ]= 1  ;
  376  
 377                           b+= 30  ;
  378  
 379                            if  (b== 60  )
  380  
 381                            {
  382  
 383                               a++ ;
  384  
 385                               b= 0  ;
  386  
 387                            }
  388  
 389                        }
  390  
 391                    }
  392  
 393                }
  394  
 395            }
  396  
 397           max= oo;
  398  
 399            for  (j= 0 ;j< 48 ;j++ )
  400  
 401            {
  402  
 403               temp= 0  ;
  404  
 405                for  (k= 49 ;k<n+ 49 ;k++ )
  406  
 407                    if  (map[k][j]> 0 ) temp++ ;
  408  
 409                if  (temp< max)
  410  
 411                   max= temp;
  412  
 413            }
  414  
 415           ans= 0  ;
  416  
 417            for  (j= 1 ;j<=max;j++ )
  418  
 419            {
  420  
 421               memset(g, 0 , sizeof  (g));
  422  
 423               memset(f, 0 , sizeof  (f));
  424  
 425               memset(current, 0 , sizeof  (current));
  426  
 427                for  (i= 0 ;i<= 49 +n;i++ )
  428  
 429                    for  (k= 0 ;k<= 49 +n;k++ )
  430  
 431                       g[i][k]= map[i][k];
  432  
 433                for  (i= 0 ;i< 48 ;i++ )
  434  
 435                   g[i][n+ 49 ]= j;
  436  
 437               ISAP( 48 ,n+ 49  );
  438  
 439               min= oo;
  440  
 441                for  (i= 0 ;i< 48 ;i++ )
  442  
 443                    if  (f[i][n+ 49 ]< min)
  444  
 445                       min=f[i][n+ 49  ];
  446  
 447                if  (min>ans) ans= min;
  448  
 449            }
  450  
 451           printf( "  %d\n  "  ,ans);
  452  
 453        }
  454  
 455    }
  456  
 457    int   main()
  458  
 459    {
  460  
 461        init();
  462  
 463        //  system("pause"); 
 464  
 465        return   0  ;
  466  
 467   }

G:聊天就是Repeat

时间限制: 1000ms 内存限制: 65536kB

描述
百度Hi作为百度旗下的即时聊天工具,在百度公司内部很是流行。要实现这样的一个聊天工具,最重要的问题就是要能保证我发出的内容能原封不动的在接收同学那里显示出来。今天,就给你一个机会,让你模拟一下百度Hi传递信息的过程,把我发给Robin的聊天内容原封不动的输出出来。

输入
输入的聊天内容数据有多组,每组数据占一行。

输出
与输入聊天内容完全相同的内容。请注意每组数据中的空格也要原封不动的被传过去噢~

样例输入
Hello Robin
今天下午去五福颁奖,具体时间是2012年8月3日 15:40噢~

样例输出
Hello Robin
今天下午去五福颁奖,具体时间是2012年8月3日 15:40噢~

  1  #include <iostream>
  2  
  3  #include < string >
  4  
  5   /* 
  6  
  7   author tilltheendwjx
   8  
  9   blog     http://blog.csdn.net/wjh200821  或者http://www.cnblogs.com/tilltheendwjx/
  10  
 11   */ 
 12  
 13   using   namespace   std;
  14  
 15   int   main()
  16  
 17   {
  18  
 19     
 20  
 21       while ( 1  )
  22  
 23       {
  24  
 25             string   str;
  26  
 27             getline(cin,str);
  28  
 29             if (str.length()<= 0  )
  30  
 31               break  ;
  32  
 33            cout<<str<< endl;
  34  
 35       }
  36  
 37      //  system("pause"); 
 38  
 39      return   0  ;   
  40  
 41  }

H:用户请求中的品牌

时间限制: 1000ms 内存限制: 65536kB

描述
馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇。在比方说“johnsonjohnson”、“duckduck”,这些词汇虽然看起来是一些词汇的单纯重复,但是往往都是一些特殊品牌的词汇,不能被拆分开。为了侦测出这种词的存在,你今天需要完成我给出的这个任务——“找出用户请求中循环节最多的子串”。

输入
输入数据包括多组,每组为一个全部由小写字母组成的不含空格的用户请求(字符串),占一行。用户请求的长度不大于100,000。
最后一行输入为#,作为结束的标志。

输出
对于每组输入,先输出这个组的编号(第n组就是输出“Case n:”);然后输出这组用户请求中循环节最多的子串。如果一个用户请求中有两个循环节数相同的子串,请选择那个字典序最小的。

样例输入
ilovejohnsonjohnsonverymuch
duckduckgo
aaabbbcccisagoodcompany
#

样例输出
Case 1: johnsonjohnson
Case 2: duckduck
Case 3: aaa

   1  #include <stdio.h>
   2  
   3  #include<cstring>
   4  
   5  #include<math.h>
   6  
   7  #include< string .h>
   8  
   9   #define  MAXN  100002
  10  
  11   int   wa[MAXN], wb[MAXN], wv[MAXN], wd[MAXN], Height[MAXN], sa[MAXN], rank[MAXN];
   12  
  13   int   n;
   14  
  15  inline  bool  IsEqual( int  *r,  int  a,  int  b,  int   l)
   16  
  17   {
   18  
  19       return  (r[a] == r[b] && r[a + l] == r[b +  l]);
   20  
  21   }
   22  
  23   void  da( int  *r,  int  m =  27  )
   24  
  25   {
   26  
  27       int  i, j, p, *x = wa, *y = wb, * t;
   28  
  29      memset(wd,  0 ,  sizeof  (wd));
   30  
  31       for  (i =  0 ; i < n; i++) wd[x[i] = r[i]]++; x[n] = y[n] =  0  ;
   32  
  33       for  (i =  1 ; i < m; i++) wd[i] += wd[i -  1  ];
   34  
  35       for  (i = n -  1 ; i >=  0 ; i--) sa[--wd[x[i]]] =  i;
   36  
  37       for  (p =  1 , j =  1 ; p <= n; m = p, j *=  2  )
   38  
  39       {
   40  
  41           for (p =  0 , i = n - j; i < n; i++) y[p++] =  i;
   42  
  43           for (i =  0 ; i < n; i++) if (sa[i] >= j)y[p++] = sa[i] -  j;
   44  
  45           for (i =  0 ; i < n; i++) wv[i] =  x[y[i]];
   46  
  47          memset(wd,  0 ,  sizeof  (wd));
   48  
  49           for (i =  0 ; i < n; i++) wd[wv[i]]++ ;
   50  
  51           for (i =  1 ; i < m; i++) wd[i] += wd[i -  1  ];
   52  
  53           for (i = n -  1 ; i >=  0 ; i--) sa[--wd[wv[i]]] =  y[i];
   54  
  55           for (t = x, x = y, y = t, i =  1 , p =  2 ,x[sa[ 0 ]] =  1 ; i < n; i++ )
   56  
  57              x[sa[i]] = IsEqual(y, sa[i- 1 ], sa[i], j) ? p -  1  : p++ ;
   58  
  59       }
   60  
  61   }
   62  
  63   void  CalHeight( int  * r)
   64  
  65   {
   66  
  67       int   i, j, k;
   68  
  69       for  (i =  0 ; i < n; i++)rank[sa[i]] =  i;
   70  
  71       for  (i =  0 , Height[ 0 ] = k =  0 ; i < n; Height[rank[i++]] =  k)
   72  
  73           for  (k?k--: 0 , j=(rank[i]> 0 )?sa[rank[i]- 1 ]: 0 ; rank[i]> 0 &&r[i+k]==r[j+k]; k++ );
   74  
  75   }
   76  
  77   int  ffmin[MAXN][ 20  ];
   78  
  79   void   setf()
   80  
  81   {
   82  
  83    int   i,j;
   84  
  85   memset(ffmin, 0 , sizeof  (ffmin));
   86  
  87    for (i= 1 ;i<=n;i++ ){
   88  
  89    ffmin[i][ 0 ]= Height[i];
   90  
  91    }
   92  
  93    for (j= 1 ;j<=( int )(log(( double )(n+ 1 ))/log( 2.0 ));j++ )
   94  
  95     for (i= 1 ;i+( 1 <<j)- 1 <=n;i++ )
   96  
  97     ffmin[i][j]=ffmin[i][j- 1 ]<ffmin[i+( 1 <<(j- 1 ))][j- 1 ]?ffmin[i][j- 1 ]:ffmin[i+( 1 <<(j- 1 ))][j- 1  ];
   98  
  99   }
  100  
 101   int  findmin( int  l, int   r)
  102  
 103   {
  104  
 105    int  k=( int )(log( 1.0 *(r-l+ 1 ))/log( 2.0  ));
  106  
 107    return  ffmin[l][k]<ffmin[r-( 1 <<k)+ 1 ][k]?ffmin[l][k]:ffmin[r-( 1 <<k)+ 1  ][k];
  108  
 109   }
  110  
 111   char   str[MAXN];
  112  
 113   int   r[MAXN];
  114  
 115   int   sp;
  116  
 117   int   tsp;
  118  
 119   int   maxl;
  120  
 121   int   main()
  122  
 123   {
  124  
 125       int  cases= 0  ,i;
  126  
 127       while (scanf( "  %s  " ,&str)!=EOF&&str[ 0 ]!= '  #  '  )
  128  
 129       {
  130  
 131        cases++ ;
  132  
 133        printf( "  Case %d:   "  ,cases);
  134  
 135        n= strlen(str);
  136  
 137        memset(r,  0 ,  sizeof  (r));
  138  
 139        maxl= 1  ;
  140  
 141         for  (i =  0 ; i < n; i++ )
  142  
 143         r[i] = str[i] -  '  a  '  +  1  ;
  144  
 145          da(r);
  146  
 147          CalHeight(r);
  148  
 149          setf();
  150  
 151          int  l,max= 1  ;
  152  
 153         sp= 0  ;
  154  
 155          for (l= 1 ;l<=n/ 2 ;l++ ){
  156  
 157          int  cur= 0  ;
  158  
 159          while (cur+l< n){
  160  
 161          if (r[cur]==r[cur+ l]){
  162  
 163          int   s,e;
  164  
 165          int   k,lcp;
  166  
 167         s= rank[cur];
  168  
 169         e=rank[cur+ l];
  170  
 171          if (s> e){
  172  
 173          s^= e;
  174  
 175          e^= s;
  176  
 177          s^= e;
  178  
 179          }
  180  
 181            s++ ;
  182  
 183            lcp= findmin(s,e);
  184  
 185         tsp= cur;
  186  
 187          int  ss= 0  ;
  188  
 189                       for  ( int  p=cur -  1 ; p>=  0  && p > (cur-l) && r[p] == r[p + l];p-- )
  190  
 191              if (++ss == (l-(lcp% l)))
  192  
 193              tsp=  p;
  194  
 195              else   if (rank[tsp] >  rank[p])
  196  
 197              tsp=  p;
  198  
 199         k=(lcp+ss)/l+ 1  ;
  200  
 201          if (k> max){
  202  
 203         max= k;
  204  
 205         maxl= l;
  206  
 207         sp= tsp;
  208  
 209          }
  210  
 211          else   if (k==max&&rank[tsp]< rank[sp]){
  212  
 213          sp= tsp;
  214  
 215          maxl= l;
  216  
 217          }
  218  
 219          }
  220  
 221         cur+= l;
  222  
 223         }
  224  
 225         }
  226  
 227         if (max> 1  ){
  228  
 229           for (i=sp;i<sp+max*maxl;i++ )
  230  
 231           printf( "  %c  "  ,str[i]);
  232  
 233          printf( "  \n  "  );
  234  
 235         }
  236  
 237         else  {
  238  
 239          char  c= '  z  '  ;
  240  
 241         for (i= 0 ;i<n;i++ )
  242  
 243          if (str[i]< c)
  244  
 245         c= str[i];
  246  
 247        printf( "  %c\n  "  ,c);
  248  
 249         }
  250  
 251        }
  252  
 253        return   0  ;
  254  
 255  }

I:地图的省钱计划

时间限制: 1000ms 内存限制: 65536kB

描述
百度地图有自己的一套坐标系(你可以把它看作一个笛卡尔坐标系),在这套坐标系里,一个标准单位为1km。而在这坐标系上针对地理信息进行标注的数据,大多数时候是通过购买的方式完成的。为了节约数据更新的成本,数据组里的鑫哥想出了一个好主意——自己测数据。
鑫哥按照他的预想开始实验;在每组试验中,鑫哥选取了三个已经被准确标注在百度地图的坐标系里的移动运营商的基站作为信号接收点(这里可以准确的得到信号的接收时间信息)。当信号接收点附近的用户手机签到时,三个信号接收点就会先后接收到这个信号,并可以准确的知晓接收到信号的时间(将第一个信号点接收到信号的时间记为0秒时刻)。由此,我们就可以确定用户手机签到的位置的在地图的准确坐标了。
现在已知以下数据:
1.三个信号接收点在百度地图坐标系中的具体坐标(x1,y1), (x2,y2), (x3,y3);
2.三个信号点得到用户发出的信号的时间t1, t2, t3(t1, t2, t3 ≥ 0),单位s; t1, t2, t3至少有一个数为0;
3.信号的转播速度C,单位m/s;
请帮助鑫哥写个程序,计算下用户发出信号的位置在百度地图坐标系内的坐标(这个点是唯一的)。

输入
输入包含多组数据,每组数据格式如下:
C
x1 y1 x2 y2 x3 y3
t1 t2 t3
最后一组数据为0,表示输入结束。

输出
针对每组测试数据,请先输出这个组的编号(第n组就是输出“Case n:”);然后换行输出信号发出点的坐标(x,y) 。x,y应该由空格分隔,并被舍入到小数点后第六位。

  1  #include<iostream>
  2  #include<cstdio>
  3  #include<cstring>
  4  #include<cstdlib>
  5  #include<cassert>
  6  #include< string >
  7  #include<algorithm>
  8  #include<fstream>
  9  #include<sstream>
 10  #include< set >
 11  #include<map>
 12  #include<vector>
 13  #include<queue>
 14  #include<deque>
 15  #include<complex>
 16  #include<numeric>
 17   using   namespace   std;
  18   double  x[ 10 ], y[ 10 ], t[ 10  ];
  19   bool  solve( int  i,  int  j,  int   k)
  20   {
  21       double   x1, y1, x2, y2, t1, t2;
  22      x1 = x[j] - x[i];
  23      x2 = x[k] - x[i];
  24      y1 = y[j] - y[i];
  25      y2 = y[k] - y[i];
  26      t1 = t[j] - t[i];
  27      t2 = t[k] - t[i];
  28      
 29       double  A1 = x1*x1 + y1*y1 - t1* t1;
  30       double  A2 = x2*x2 + y2*y2 - t2* t2;
  31       double  A = A1*y2-A2*y1, B = A1*x2-A2*x1, C = A1 * t2 - A2 *  t1;
  32       double  cita =  atan2(B, A);
  33       double  sum = asin(- C/sqrt(A*A+B*B+1e- 15  ));
  34      
 35       double  alpha = sum -  cita;
  36       double   r;
  37       if  (abs(A1)> abs(A2))
  38          r = A1/(t1 + x1 *cos(alpha) + y1 * sin(alpha))/ 2  ;
  39       else 
 40          r = A2/(t2 + x2 *cos(alpha) + y2 * sin(alpha))/ 2  ;
  41      
 42       if  (r< 0  )
  43       {
  44          sum = - sum +  3.141592653579  ;
  45          alpha = sum -  cita;
  46           if  (abs(A1)> abs(A2))
  47              r = A1/(t1 + x1 *cos(alpha) + y1 * sin(alpha))/ 2  ;
  48           else 
 49              r = A2/(t2 + x2 *cos(alpha) + y2 * sin(alpha))/ 2  ;
  50       }
  51              
 52          
 53      printf( "  %.6f %.6f\n  " , r * cos(alpha) + x[i], r * sin(alpha) +  y[i]);
  54   }
  55   int   main()
  56   {
  57       for  ( int  dd =  1 ; ; ++  dd)
  58       {
  59           double   c;
  60          scanf( "  %lf  " , &  c);
  61          c/= 1000  ;
  62           if  (abs(c) < 1e- 6  )
  63               break  ;
  64          scanf( "  %lf %lf %lf %lf %lf %lf  " , x, y, x+ 1 , y+ 1 , x+ 2 , y+ 2  );
  65          scanf( "  %lf %lf %lf  " , t, t+ 1 , t+ 2  );
  66          printf( "  Case %d:\n  "  , dd);
  67          t[ 0 ] *=  c;
  68          t[ 1 ] *=  c;
  69          t[ 2 ] *=  c;
  70           if  (solve( 0 ,  1 ,  2  ))
  71               continue  ;        
  72       }
  73       return   0  ;
  74  }

J:百度的新大厦

时间限制: 1000ms 内存限制: 65536kB

描述
继百度搜索框大厦之后,百度又于2012年初在深圳奠基了新的百度国际大厦,作为未来百度国际化的桥头堡。不同于百度在北京的搜索框大厦,新的百度国际大厦是一栋高楼,有非常多的楼层,让每个楼中的电梯都能到达所有楼层将是一个极为不明智的设计。因此,设计师给出了一个特别的设计——一共大厦有m个电梯,每个电梯只有两个按钮,(针对第i个电梯)两个按钮分别可以使电梯向上或ui层向下一定di层;百度国际大厦很高,你永远到不了顶层,也就是说电梯没有上限,但是,电梯不可以钻入地下,也就是说是有下限的。我们将每层楼用整数标记,为了体现IT公司的特质,我们以0作为地面这一层的标记。
如果你某天在百度国际大厦的0层,仅可以选择m个电梯中的一个乘坐(不可以中途换电梯),请你计算,你按电梯中的按钮n次后(每次两个按钮选一个按),可以到达的最低楼层数。

输入
输入的第一行包括两个整数,分别为n和m(1 ≤ n ≤ 1,000,000,1 ≤ m ≤ 2,000),表示按电梯按钮的次数和大厦中的电梯数量。接下去的m行,每行包括2个由空格分割的数字,分别表示了提供的m个电梯中的某一个的上行按钮上升一次的层数ui和下行按钮下降一次的层数di(1 ≤ ui,di ≤ 1000)

输出
输出一个正整数,表示选用m个电梯中的一个后,在电梯里按电梯中的按钮n次后(每次两个按钮选一个按),可以到达的最低楼层数。

提示
按钮上的移动楼层数无法改变,比方说从8层向下9层是不可行的

 

   1  #include <stdio.h>
   2  
   3  #include <stdlib.h>
   4  
   5  #include <math.h>
   6  
   7   /* 
   8  
   9   author tilltheendwjx
   10  
  11   blog     http://blog.csdn.net/wjh200821  或者http://www.cnblogs.com/tilltheendwjx/
   12  
  13   */ 
  14  
  15   int   main()
   16  
  17   {
   18  
  19       int   n,m;
   20  
  21       int  * a;
   22  
  23       int  * b;
   24  
  25       int  i= 0  ;
   26  
  27       int  reault= 0  ;
   28  
  29       int  j= 0  ;
   30  
  31       int   tmp;
   32  
  33       int  low= 1  ;
   34  
  35       int  high= 0  ;
   36  
  37      scanf( "  %d%d  " ,&n,& m);
   38  
  39      high= n;
   40  
  41       int   mid;
   42  
  43      a=( int  *)malloc( sizeof ( int )* m);
   44  
  45      b=( int  *)malloc( sizeof ( int )* m);
   46  
  47       for (i= 0 ;i<m;i++ )
   48  
  49       {
   50  
  51          scanf( "  %d%d  " ,&a[i],& b[i]);
   52  
  53       }
   54  
  55       for (i= 0 ;i<m;i++ )
   56  
  57       {
   58  
  59          low= 1  ;
   60  
  61          high= n;
   62  
  63           while ((high-low)> 2  )
   64  
  65           {
   66  
  67             mid=(low+high)/ 2  ;
   68  
  69             tmp=a[i]*mid-b[i]*(n- mid);
   70  
  71              if (tmp> 0  )
   72  
  73               {
   74  
  75                   high= mid;     
   76  
  77               }
   78  
  79               else 
  80  
  81               {
   82  
  83                   low=mid+ 1  ;
   84  
  85               }           
   86  
  87                        
  88  
  89           }
   90  
  91           for (j=low;j<=high;j++ )
   92  
  93           {
   94  
  95                   tmp=a[i]*j-b[i]*(n- j);
   96  
  97                    if (tmp> 0  )
   98  
  99                   { break  ;}      
  100  
 101           }    
  102  
 103           if (reault== 0  )
  104  
 105             reault= tmp;
  106  
 107           else   if (reault> tmp)
  108  
 109             reault= tmp;
  110  
 111           else 
 112  
 113             reault= reault;
  114  
 115            
 116  
 117       }
  118  
 119      printf( "  %d  "  ,reault);
  120  
 121       //  system("pause"); 
 122  
 123      return   0  ;  
  124  
 125  }

  /* n次按键,m个电梯。每次选择上up,或者下down;

每次有一个能到达最小的层数;共有m个电梯选一个。输出最优解。

*/

 

#include "stdio.h"

int main()

{

     int m,n,i;

     int dist=9999;

     scanf ( "%d%d" ,&n,&m);

     for (i=1;i<=m;i++)

     {

         int u,d;

         scanf ( "%d%d" ,&u,&d);

         int jTemp = ( int )(d*n)/(u+d);

         int udTemp1=u*jTemp-d*(n-jTemp);

         int udTemp2=u*(jTemp+1)-d*(n-jTemp-1);

         if (udTemp1<=0 && udTemp2>0){

             if (udTemp2<dist)

                      dist = udTemp2;

         }

         else if (udTemp1>0)

         {

             if (udTemp1<dist)

                     dist = udTemp1;

         }

     }

     printf ( "%d\n" ,dist);

     return 0;

}

 

标签:  百度之星 资格赛 AC代码

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于2012百度之星资格赛试题与AC代码合集的详细内容...

  阅读:51次