2013腾讯编程马拉松初赛第三场(3月23日)

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

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

#include
#include
using namespace std;

int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int month1[]={0,31,29,31,30,31,30,31,31,30,31,30,31};
bool is_run(int y)
{
    if( (y%4==0&&y%100!=0) || y%400==0)return true;
    else return false;
}
int main()
{
    int a[3];
    int res[3];
    int res1[3];
    int T,t,i,n;
    cin>>T;
    while(T--)
    {
        
        a[0]=2013;a[1]=3;a[2]=24;
        cin>>t;
        a[2]+=t;
        while(a[2]> (is_run(a[0])?month1[a[1]]:month[a[1]] ) )
        {
            a[1]++;
            if(a[1]>=13)
            {
                a[0]++;
                a[1]-=12;
            }
            if(a[1]==3)
            {
                a[2]-=(is_run(a[0])&&a[1]==3?29:28);
            }
            else
            {
                int mm;
                if((a[1]-1+12)%12 == 0)
                    mm=1;
                else
                    mm=(a[1]-1+12)%12;
                a[2]-=month[mm];
            }
        }
        printf("%04d/%02d/%02d ",a[0],a[1],a[2]);
        

        a[0]=2013;a[1]=3;a[2]=24;
        a[2]-=t;
        while(a[2]<=0 )
        {
            a[1]--;
            if(a[1]<=0)
            {
                a[0]--;
                a[1]+=12;
            }
            if(a[1]==2)
            {
                a[2]+=(is_run(a[0])&&a[1]==2?29:28);
            }
            else
            {
                int mm;
                if((a[1]+12)%12 == 0)
                    mm=12;
                else
                    mm=(a[1]+12)%12;
                a[2]+=month[mm];
            }
        }
        printf("%04d/%02d/%02d\n",a[0],a[1],a[2]);
    }
}

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

#include 
#include 
#include 
using namespace std;
int map[2010][2010];
char map2[2010][2010];
int n,m,x,y;

int main()
{
    int i,j,ans,temp;
    while(cin>>n>>m && n && m)
    {
        ans=0;
        cin>>x>>y;
        for(i=1;i<=n;i++)
        cin>>map2[i];
        for(i=0;i<=n+1;i++)
        {
            for(j=0;j<=m+1;j++)
            {
                if(i==0 || j==0 || i==n+1 || j==m+1)
                {
                    map[i][j]=0;
                }
                else
                {
                    if(map2[i][j-1]=='*')
                    {
                        map[i][j]=1;
                    }
                    else
                    map[i][j]=0;
                }
            }
        }
        for(j=1;j<=m;j++)
        {
            for(i=n;i>=1;i--)
            {
                map[i][j]+=map[i][j-1]+map[i+1][j]-map[i+1][j-1];
            }
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                if(i+x-1<=n && j+y-1<=m)
                {
                    temp=map[i][j+y-1]-map[i][j-1]-map[i+x][j+y-1]+map[i+x][j-1];
                    if(temp==x*y)
                    ans++;
                }
                if(i+y-1<=n && j+x-1<=m)
                {
                    temp=map[i][j+x-1]-map[i][j-1]-map[i+y][j+x-1]+map[i+y][j-1];
                    if(temp==x*y)
                    ans++;
                }
            }
        }
        if(x==y)
        ans=ans/2;
        cout<

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

Time Limit: 1.0 Seconds   Memory Limit: 32768K

郑厂长不是正厂长

也不是副厂长

他根本就不是厂长

只是公司的一个码农

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

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

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

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

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

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

Input

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

接下去有T组测试数据,每组测试数据占一行,包含三个整数NKM,N表示员工的人数,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分钟即可完成体检工作。

#include
#include
#include
using namespace std;
int main()
{
    int text;
    cin>>text;
    while(text--)
    {
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        if(n




你可能感兴趣的:(2013腾讯编程马拉松初赛第三场(3月23日))