2013 腾讯马拉松初赛 第1场

本文解析了五道编程题目,包括简单模拟题、快速幂计算、动态规划问题、暴力求解及线段树优化等。通过示例代码详细介绍了每种题目的解题思路与实现方法。

1. 简单模拟题

 

2. 快速幂,加上一点数组的处理。。  其实也是很简单的,但是我交了好几次才过...

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

typedef __int64 LL;
#define MOD 1000000007
int n,t,k;

LL g[100100];

LL fuc()
{
    if(t==0) return 1;
    LL sum=k;
    LL s=1;
    while(t!=1)
    {
        if(t%2==0)
        {
            sum=(sum*sum)%MOD;
            t/=2;
        }
        else
        {
            s=(s*sum)%MOD;
            sum=(sum*sum)%MOD;
            t/=2;
        }
    }
    sum=(sum*s)%MOD;
    return sum;
}
LL save[100100];

int main()
{
    int t1;
    scanf("%d",&t1);
    while(t1--)
    {
        scanf("%d%d%d",&n,&t,&k);
        for(int i=1;i<=n;i++)
            scanf("%I64d",&g[i]);
        int tt=t%n;
        LL key=fuc();
        int cnt=0;
        for(int i=n-tt+1;i<=n;i++)
        {
            save[cnt++]=((LL)g[i]*key)%MOD;
        }
        for(int i=1;i<=n-tt;i++)
            save[cnt++]=((LL)g[i]*key)%MOD;

        for(int i=0;i<cnt-1;i++)
            printf("%I64d ",save[i]);
        printf("%I64d",save[cnt-1]);
        printf("\n");
    }
    return 0;
}

 4. dp题,和背包很类似, 不过这个是从1-m   每次用1-n 来更新...

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

typedef __int64 LL;
LL dp[100100];
LL gx[110],gy[110];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        int m;
        for(int i=0;i<n;i++)
        {
            scanf("%I64d%I64d",&gx[i],&gy[i]);
        }
        scanf("%d",&m);
        for(int i=0;i<=m;i++)
        {
            int w,c;
            LL tmp=dp[i];
            for(int j=0;j<n;j++)
            {
                LL w=gx[j];
                LL c=gy[j];
                if(i<c) continue;
                tmp=max(tmp,dp[i-c]+w);
            }
            dp[i]=tmp;
        }
        printf("%I64d\n",dp[m]);
    }
    return 0;
}

 

5. 暴力都能过的题, 可以用线段树优化...

 

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;


int g[100100];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(g,0,sizeof(g));
        int f,e;
        int x,y;
        for(int i=0;i<n;i++)
        {
            scanf("%d:%d",&x,&y);
            f=x*60+y;
            scanf("%d:%d",&x,&y);
            e=x*60+y;
            for(int i=f;i<e;i++)
                g[i]=1;
        }
        int sum=0;
        for(int i=0;i<1500;i++)
        {
            if(g[i]==1) sum++; 
        }
        printf("%d\n",1440-sum);
    }

    return 0;
}

 

 

转载于:https://www.cnblogs.com/chenhuan001/archive/2013/03/22/2975414.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值