2013腾讯编程马拉松初赛(3月23)赛题及第3,5题源代码(C++)

本文提供了四个编程挑战赛题目的解析及示例代码,包括时间旅行的日期计算、多项式的因式分解、游戏中的策略问题及体检安排优化。

1001Q系列故事——世界上最遥远的距离

Time Limit: 0.2 Seconds   Memory Limit: 65536K

 

世界上最遥远的距离

不是生与死
而是我就站在你面前
你却不知道我爱你

 

世界上最遥远的距离
不是我就站在你面前你却不知道我爱你
而是明明知道彼此相爱
却不能在一起

 

世界上最遥远的距离
不是明明知道彼此相爱却不能在一起
而是相约好了私奔的时间
我穿越到了未来你却回去了古代

 

——摘自《小Q失恋日记》第117513

 

当小Q使出浑身解数,终于赢得HR女神芳心的时候,却出现了一个意外情况,那就是白富美HR的妈妈并不同意他们交往,当听说小Q只是一个码农,特别是听说小Q曾经参加过资本主义国家发起的SM/ICPC比赛的时候,更是坚决反对!

爱情是伟大的,但是得不到亲人祝福的爱情却备受折磨,小Q和HR相约在腾讯第二届编程马拉松大赛进行到第5天的时候(即2013324日),一起“向前穿越D天,然后开启幸福新生活”。

其勇气可谓令人赞叹,但可怜的小Q却总是备受折磨——小Q理解的向前穿越是朝着未来的方向,而女友HR理解的“向前穿越”却是朝着古代的方向!

假设已知现在的日期和穿越的天数D,你能计算出小Q和女友各自到达的年代吗?

 

Input

 

  输入首先包含一个整数N,表示有N组测试用例;

  接下来N行是N组数据,每一行包含一个正整数DD<=10,0000),D表示向前穿越的天数。

 

Output

 

  请计算并输出小Q和女友分别到达的日期,日期格式为YYYY/MM/DD,两个日期中间用一个空格隔开,每组数据占一行,具体输出格式请参见样例。

 

Sample Input

 

2

6

30

 

Sample Output

 

2013/03/30 2013/03/18

2013/04/23 2013/02/22


1002威威猫系列故事——因式分解

Time Limit: 0.2 Seconds   Memory Limit: 65536K

“春天来了,万物复苏,大地一片生机盎然,又到了动物们求偶的季节...

周末的威威猫虽然眼睛盯着电视屏幕,但是思绪却停留在自己喜欢的数学问题上。

有人说孤独是可耻的,但是单身一人的威威猫并不孤独,随着对数学的深入学习,威威猫甚至很庆幸自己没有陷入儿女情长,因为他有喜爱的数学相伴,最近,他就在潜心研究因式分解问题。

在我们学习数学的过程中,经常需要把一个多项式进行因式分解,也就是把它写成乘积的形式,比如多项式x^2+3x+2分解因式的结果就是(x+1)(x+2)。这个因式一眼就能看出来,但是当x的指数更高时,就不太容易分解了。

现在,威威猫就是在研究如何编写程序来实现对多项式的因式分解。

Input

输入第一行是一个整数T(T<=50),表示测试数据的组数;

接下来是T行字符串表示T个测试用例,每行1个数学多项式,多项式长度不会超过100个字符,每个多项式表示形式如下:   A[1]x^P[1]+A[2]x^P[2]+...+A[m]x^P[m]

其中0<=P[i]<=5A[i]表示x^P[i]的系数,A[i]=0时直接简写为0,A[i]=1-1时分别简写为x^P[i]-x^P[i]P[i]=01时分别简写为A[i]A[i]x,且同一指数r的对应项系数之和的绝对值不超过1000,每行中没有多余空格,具体格式可参考Sample Input

Output

对于每组测试数据,首先输出Case #X:X代表多项式编号,从1开始计数,然后输出因式分解的结果,分解结果的表示形式规定如下:

(x+B[1])(x+B[2])...(x+B[m])

其中,B[1]<=B[2]<=...<=B[m],B[i]=0则不加括号直接简写为x,如果无法表现成上述格式,则输出"-1"

具体可参考Sample Output

Sample Input

4

x

x+1

-2x^2+x^2+x^3

2x+2

 

Sample Output

Case #1: x

Case #2: (x+1)

Case #3: (x-1)xx

Case #4: -1


1003小小明系列故事——游戏的烦恼

Time Limit: 1.0 Seconds   Memory Limit: 32768K

 

小小明最近在玩一款游戏,它由n*m大小的矩阵构成,矩阵上会随机产生一些黑色的点,这些点它们可能会连在一起也可能会分开,这些点的个数没有限制,但是每个1*1方格中最多只可能有一个黑点产生。游戏要求玩家以最短的时间用x*y的小矩阵覆盖这个大矩阵,覆盖的要求有以下2点:

1. x*y大小的小矩阵内必须有x*y个黑点。

2.多个小矩阵可以重叠,但是每个小矩阵放置的位置必须是独一无二的,即不同的小矩阵内的黑点不能完全相同。例如1*2的矩阵可以横着放,也可以竖着放,这两种方法是不同的,即使它们可能共用黑点。

小小明是个粗心的孩子,他尝试了很多遍都无法将所有的符合要求的小矩阵找到,聪明的你,能不能告诉烦恼中的小小明这个大矩阵里有多少个满足要求的小矩阵呢?

 

Input

 

题目有多组测试数据(不多于100个);

每组测试数据的第一行包含2个正整数nm,然后第二行是xynmxy的意思如题),接下来n行,每行m个字符,其中’ * ’表示黑点,’ . ’表示空白。

nm0则结束输入。

 

[Technical Specification]

0 < n, m <= 2000

0 < x, y <= 1000

 

Output

 

请计算并输出一共有多少个满足要求的小矩阵,每组输出占一行。

 

Sample Input

2 3

1 2

**.

.**

0 0

 

Sample output

3

 


1004吉哥系列故事——最终数

Time Limit: 0.2 Seconds   Memory Limit: 65536K

2012年腾讯编程马拉松比赛中,吉哥解决了一道关于斐波那契的题目,这让他非常高兴,也更加燃起了它对数学特别是斐波那契数的热爱。现在,它又在思考一个关于斐波那契的问题:

假如我们现在已知斐波那契数是1123581321345589...

由于吉哥特别喜欢斐波那契数,它希望每个数中都包含斐波那契数,比如说130,其中包含了13,或者5534包含了5534,只要数位中含有至少一个斐波那契数就是吉哥想要的数。但是这种数实在太多了,于是它去掉那些仅仅含有小于10的斐波那契数的数,比如说1,仅仅含有1,所以被去掉;或者335只含有35,都是小于10的斐波那契数,所以也去掉;但是131是留下的,因为它含有13,我们暂且称这类数为F,不难得到前几个F数是 13 21 34 55 89113121130131...

霸气的吉哥觉得这样还不够,它想将斐波那契进行到底——在前面F数的基础上,吉哥要得到那些是第斐波那契数个的F数!就是说,我们假设F数从1开始标号,那么13是第1F数,吉哥想要那些在F数中的排列或者说下标也要是斐波那契数的数,吉哥称之为最终数,如13213489130...

现在给你一个数n,吉哥想知道离n最近的最终数与n的差的绝对值是多少。

Input

输入包含多组测试数据。

每组测试数据包含一个整数n ( 1 <= n <= 10^11)

n = -1,表示输入结束。

Output

对于每个n,请输出离n最近的最终数与n的差的绝对值。

 

Sample Input

1

100

-1

Sample Output

12

11

 


1005郑厂长系列故事——体检

Time Limit: 1.0 Seconds   Memory Limit: 32768K

 

郑厂长不是正厂长

也不是副厂长

他根本就不是厂长

只是公司的一个码农

 

郑厂长所在的腾讯公司每一年都要组织员工体检,比如量身高体重、测血压之类的,今年也不例外。

这次总共有N位员工接受体检,并且每个员工都需要做K个项目的检查才算完成整个体检的流程。现在来了M个医生为员工做身体检查,并且每一位医生都带齐了检查这K个项目的器材来(也就是说每个医生都能进行这K个项目中的任意一项检查)

体检的详细流程是这样的:

公司事先制定好了M份体检单,每个医生手上都各自拿到一份体检单,上面已经安排好了检查的次序,以及每一次检查所对应的员工和项目。每个医生按照体检单上的次序为相应的员工做相应的项目检查。医生拿到的体检单上的名单也可以是空的,就是这个医生不需要检查任何员工的任何项目。

当然,制定出的这M份体检单不能有问题存在,否则就会有混乱的情况发生。按照常理来说,同一个医生在同一时间只能为一个员工做一个项目的检查。另外,同一个员工在同一时间也只能进行一个项目的检查,当然,不同的医生或不同的员工可以在同一时间进行项目检查。现在假设每个员工的每个项目的检查时间都是一分钟(其它时间花费忽略不计,只考虑项目检查工作所花费的一分钟)

公司希望体检的工作越快完成越好,由于郑厂长大学期间曾经是一个ACMer,所以公司就将体检的安排工作交给了他,他需要计算出最快需要多少分钟能完成所有员工的体检工作。

 

Input

 

输入的第一行为一个正整数T,表示有T组测试数据;

接下去有T组测试数据,每组测试数据占一行,包含三个整数NKMN表示员工的人数,K表示体检的项目数,M表示医生的人数。

 

[Technical Specification]

T<=1000

1<=N<=100

1<=K<=10

1<=M<=100

Output

 

对于每组数据,输出一个整数,表示最快需要多少分钟才能完成所有员工的体检工作。

 

 

Sample Input

 

2

2 1 1

3 2 2

 

Sample Output

 

2

3

 

Hint

对于第二组数据体检单的安排可以是如下情况:

1个医生的体检单:员工A的项目1、员工A的项目2、员工B的项目2

2个医生的体检单:员工B的项目1、员工C的项目1、员工C的项目2

第一分钟:第1个医生检查员工A的项目1,而第2个医生检查员工B的项目1

第二分钟:第1个医生检查员工A的项目2,而第2个医生检查员工C的项目1

第三分钟:第1个医生检查员工B的项目2,而第2个医生检查员工C的项目2

这样就只需要3分钟即可完成体检工作。

 

 

其中第3题源代码如下:

3:

#include <stdio.h>

void main()
{
 int n,m,x,y;
 scanf("%d %d",&n,&m);
 scanf("%d %d",&x,&y);
 
    while((n!=0)&&(m!=0))
    {
   char **k=new char*[n];
   int i;
   for(i=0;i<n;i++)
   {
   k[i]=new char[m+1];
   scanf("%s",k[i]);
   }
  
   int j,a,b,x1,y1,flag=1;
   int counts=0;
   for(i=0;i<=n-x;i++)
   {   
    x1=i;   
    for(j=0;j<=m-y;j++)//横着放
    {
     y1=j;
     flag=1;//假设存在

     for(a=x1;a<x1+x;a++)
     {
      for(b=y1;b<y1+y;b++)
      {
       if(k[a][b]!='*')
       {
        flag=0;
        break;
       }

      }
      if(flag==0)
       break;
     }//完成一次判定
     if(flag==1)
                    counts++;
    }
   }
     
   if(x!=y)//竖着放
   {
    for(i=0;i<=n-y;i++)
    {
      x1=i;   
      for(j=0;j<=m-x;j++)
      {
      y1=j;
      flag=1;//假设存在

      for(a=x1;a<x1+y;a++)
      {
      for(b=y1;b<y1+x;b++)
      {
       if(k[a][b]!='*')
       {
        flag=0;
        break;
       }

      }
      if(flag==0)
       break;
      }
      if(flag==1)
                    counts++;
      }
    }
   }//end_of_if
  
   printf("%d\n",counts);

   scanf("%d %d",&x,&y);
    
    }  
}

5:

#include <stdio.h>

void main()
{
    int T,N,K,M;   
    scanf("%d",&T);
   
    int i;
    for(i=0;i<T;i++)
    {
        scanf("%d %d %d",&N,&K,&M);
        if(N<=M)//人少,医生多
            printf("%d\n",K);
        else
        {
            int m;
            int f=(N*K)%M;
            if(f==0)
               m=(N*K)/M;
            else
               m=(N*K)/M+1;
            printf("%d\n",m);
        }   
    }  
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值