2013腾讯编程马拉松初赛第0,1场

HDU4500

直接模拟

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  55
#define ll __int64

int z[MAXN][MAXN];
int s1[4]={1,0,-1,0};
int s2[4]={0,1,0,-1};

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==m&&m==0)
            break;
        memset(z,0,sizeof(z));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                scanf("%d",&z[i][j]);
        }
        int a,b,mx;
        a=b=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                int sum=0;
                for(int k=0;k<4;k++)
                {
                    int x,y;
                    x=i+s1[k];
                    y=j+s2[k];
                    if(z[i][j]>0)
                    {
                        sum=sum-z[x][y];
                    }
                    else
                    {
                        sum=sum+z[x][y];
                    }
                }
               // printf("%d\n",sum);
                if(i==1&&j==1)
                    mx=sum;

                if(sum>mx)
                {
                    a=i;
                    b=j;
                    mx=sum;
                }
            }
        }
        printf("%d %d %d\n",a,b,mx);
    }
    return 0;
}

HDU4501

0 1背包

dp[i][j][k]  代表 用掉 i 次 免费  钱为 j 积分为k 能得到的最大价值

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  110
#define ll __int64

int dp[6][MAXN][MAXN];

struct node
{
    int v1,v2,w;
}z[MAXN];

int main()
{
    int n,v1,v2,k;
    while(scanf("%d%d%d%d",&n,&v1,&v2,&k)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&z[i].v1,&z[i].v2,&z[i].w);
        for(int i=1;i<=n;i++)
        {
            for(int j=v1;j>=0;j--)
            {
                for(int kk=v2;kk>=0;kk--)
                {
                    for(int jj=k;jj>=0;jj--)
                    {
                        int now=0;
                        if(jj>0)
                            now=max(now,dp[jj-1][j][kk]+z[i].w);
                        if(kk>=z[i].v2)
                            now=max(now,dp[jj][j][kk-z[i].v2]+z[i].w);
                        if(j>=z[i].v1)
                            now=max(now,dp[jj][j-z[i].v1][kk]+z[i].w);
                        dp[jj][j][kk]=max(dp[jj][j][kk],now);
                    }
                }
            }
        }
        printf("%d\n",dp[k][v1][v2]);
    }
    return 0;
}

HDU4502

区间DP

dp[i][j]  代表i ~ j 天能得到的最大工资

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  1010
#define ll __int64

int dp[110][110];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d%d",&m,&n);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            int a,b,w;
            scanf("%d%d%d",&a,&b,&w);
            dp[a][b]=max(dp[a][b],w);
        }
        for(int l=1;l<=m;l++)
        {
            for(int j=1;j<=m;j++)
            {
                int en=j+l-1;
                for(int k=j;k<en;k++)
                    dp[j][en]=max(dp[j][en],dp[j][k]+dp[k+1][en]);
            }
        }
        printf("%d\n",dp[1][m]);
    }
    return 0;
}

HDU4503

考虑反面  第 i个人 调一个他的朋友 一个不是朋友

a*(n-a-1)    求和除2  就是不满足情况的 然后总的C(n,3)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  1010
#define ll __int64

int dp[110][110];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int num=0;
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            num=num+a*(n-a-1);
        }
        num=num/2;
        int sum=n*(n-1)*(n-2)/6;
        printf("%.3lf\n",1.0*(sum-num)/sum);
    }
    return 0;
}

HDU4504

dp[i][j]  到第 j 次一共拿到i分

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  1010
#define ll __int64

ll dp[1100][40];

int main()
{
    int  n,m,t;
    while(scanf("%d%d%d",&n,&m,&t)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        int a=t/15;
        int b=a/2;
        m=m+b;
        int ti;
        if(a%2==0)
            ti=b;
        else
            ti=b+1;
        dp[n][0]=1;
        for(int i=1;i<=ti;i++)
        {
            for(int j=n+i;j<=n+i*3;j++)
            {
                if(j-1>=0)
                dp[j][i]+=dp[j-1][i-1];
                if(j-2>=0)
                dp[j][i]+=dp[j-2][i-1];
                if(j-3>=0)
                dp[j][i]+=dp[j-3][i-1];
            }
        }
        ll sum=0;
        for(int i=m+1;i<=n+ti*3;i++)
        {
             sum=sum+dp[i][ti];
            // printf("%d %d\n",i,dp[i][ti]);
        }
        printf("%I64d\n",sum);
    }
    return 0;
}

HDU4505

可以一起下电梯

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  110
#define ll __int64

int z[MAXN];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(z,0,sizeof(z));
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            z[a]++;
        }
        int ans=0;
        for(int i=100;i>=1;i--)
        {
            if(z[i])
            {
                ans=ans+10*i;
                break;
            }
        }
        for(int i=1;i<=100;i++)
        {
            if(z[i])
            {
                ans=ans+5+z[i];
            }
        }
        printf("%d\n",ans);

    }
    return 0;
}

HDU4506

找一下规律 就是一次向后面移一格 然后 乘以k  循环节 n

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  10010
#define ll __int64

ll Quick(ll a,ll b,ll c)
{
    ll ans=1;
    while(b)
    {
        if(b&1)
            ans=(ans*a)%c;
        b>>=1;
        a=(a*a)%c;
    }
    return ans;
}
ll z[MAXN];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll n,k,t;
        scanf("%I64d%I64d%I64d",&n,&t,&k);
        ll a=Quick(k,t,inf);
        ll b=t%n;
        for(int i=0;i<n;i++)
            scanf("%I64d",&z[i]);

        if(b==n-1)
        {
            for(int i=1;i<=n-1;i++)
                printf("%I64d ",(z[i]*a)%inf);
            printf("%I64d\n",(z[0]*a)%inf);
        }
        else
        {
            for(int i=n-b;i<n;i++)
                printf("%I64d ",(z[i]*a)%inf);
            for(int i=0;i<n-b-1;i++)
                printf("%I64d ",(z[i]*a)%inf);
            printf("%I64d\n",(z[n-b-1]*a)%inf);
        }

    }
    return 0;
}

7  数位DP  不过好像不会

HDU4508

完全背包?

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  110
#define ll __int64

struct node
{
    int v,co;
}z[MAXN];
int dp[100010];

int main()
{
    int  n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            scanf("%d%d",&z[i].v,&z[i].co);
        int m;
        scanf("%d",&m);
        for(int i=1;i<=n;i++)
        {
            for(int j=z[i].co;j<=m;j++)
            {
                dp[j]=max(dp[j],dp[j-z[i].co]+z[i].v);
            }
        }
        printf("%d\n",dp[m]);
    }
    return 0;
}

HDU4509

排序 区间的交   线段树麻烦了

#include <iostream>
#include <cstdio>
#include <cmath>
#include <map>
#include <algorithm>
#include <cstring>
#include <string>
#include<set>

using namespace std;

#define inf 1000000007
#define MAXN  500010
#define ll __int64

struct node
{
    int st,en;
}z[MAXN];
bool cmp(node a,node b)
{
    if(a.st==b.st)
        return a.en<b.en;
    return a.st<b.st;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            int a,b,c,d;
            scanf("%d:%d %d:%d",&a,&b,&c,&d);
            z[i].st=a*60+b;
            z[i].en=c*60+d;
        }
        sort(z+1,z+n+1,cmp);
        int st,en;
        st=en=0;
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            if(z[i].st>en)
            {
                sum=sum+z[i].st-en;
                st=z[i].st;
                en=z[i].en;
            }
            else if(z[i].st<=en)
            {
                en=max(en,z[i].en);
            }
        }
        if(en<1440)
            sum=sum+1440-en;
        printf("%d\n",sum);
    }
    return 0;
}

时间: 2024-10-31 20:17:14

2013腾讯编程马拉松初赛第0,1场的相关文章

2013腾讯编程马拉松初赛第4,5场

HDU 4520 A 直接模拟 #include <iostream> #include <cstdio> #include <cmath> #include <map> #include <algorithm> #include <cstring> #include <string> #include<set> #include<deque> using namespace std; #defin

HDU 4508 湫湫系列故事——减肥记I (2013腾讯编程马拉松初赛第一场)

http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n开始,表示每天的食物清单有n种食物. 接下来n行,每行两个整数a和b,其中a表示这种食物可以带给湫湫的幸福值(数值越大,越幸福),b表示湫湫吃这种食物会吸收的卡路里量. 最后是一个整数m,表示湫湫一天吸收的卡路里不能超过m. 思路: 完全背包. 一开始以为是01背包. 敲了01后样例2不对啊!!! 然后改成完全就过了..就改循环体就好了.. #includ

HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4528 小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1464    Accepted Submission(s): 423 Problem Description 小明的妈妈生了三个孩子,老大叫大明, 老二叫

2013腾讯编程马拉松初赛第〇场(3月20日)(HDU 4500 4501 4502 4503 4504)

小Q系列故事--屌丝的逆袭 Time Limit : 300/100ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 1   Accepted Submission(s) : 1 Problem Description 毕业于普通本科的小Q一直自称是资深屌丝,不仅学校不知名,甚至他自己在这个普通学校也是默默无闻--直到临近毕业的时候,班里5朵金花中的2位甚至从没和他说过话! 谁又能想到

HDU - 4544 湫湫系列故事――消灭兔子 2013腾讯编程马拉松复赛第三场

Description 湫湫减肥 越减越肥! 最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏. 游戏规则很简单,用箭杀死免子即可. 箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别为Di(1 <= i <= M),每种箭需要一定的QQ币购买. 假设每种箭只能使用一次,每只免子也只能被射一次,请计算要消灭地图上的所有兔子最少需要的QQ币. Input 输入数据有多组,每组数据有四行: 第一行有两个整数N,M(1 <= N, M &l

HDOJ 4509 湫湫系列故事——减肥记II(2013腾讯编程马拉松) 并查集合并区间

发现这种合并区间的题目还可以这么玩 给你n段时间 然后问没被占用的时间是多少 题目所给的区间是右开的导致我wa 好多人5e5*1440的暴力跑出来的时间居然只是我的两倍 不懂.... 所以并查集并没有跑的很快  奇怪.... 1 #include <stdio.h> 2 #include <iostream> 3 #include <algorithm> 4 #include <string.h> 5 #include <math.h> 6 #i

HDU 4508 沼泽湿地系列故事——记住减肥I (2013腾讯编程马拉松预赛第一)

pid=4508">http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n開始,表示每天的食物清单有n种食物. 接下来n行,每行两个整数a和b.当中a表示这样的食物能够带给湫湫的幸福值(数值越大,越幸福),b表示湫湫吃这样的食物会吸收的卡路里量. 最后是一个整数m,表示湫湫一天吸收的卡路里不能超过m. 思路: 全然背包. 一開始以为是01背包. 敲了01后例子2不正确啊... 然后改成全然就过了..就改

hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 889    Accepted Submission(s): 207 Problem Description "今有物不知其数,三三数之有二,五五数之有三,七七数之有

C# 网络编程之豆瓣OAuth2.0认证详解和遇到的各种问题及解决

        最近在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同时自己需要一个个的尝试与解决,最终完成了豆瓣API的访问.作者这里就不再吐槽豆瓣的认证文档了,毕竟人家也不容易.但是作者发现关于豆瓣OAuth认证过程的文章非常之少,所以想详细写这样一篇文章方便后面要做同样东西的人阅读.希望文章对大家有所帮助,尤其是想做豆瓣API开发的初学者. (文章中蓝色字表示官方文档引用,红色字是可能遇到问题及注意,黑色字是作者叙述) 一.误区OAuth1.0认证过程