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;

#define inf 1000000000000007
#define MAXN 100010
#define ll __int64

double z[50];

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            break;
        double sum=0,mx=0,mi=10;

        for(int i=1;i<=n;i++)
        {
            scanf("%lf",&z[i]);
            sum=sum+z[i];
            mx=max(mx,z[i]);
            mi=min(mi,z[i]);
        }
        sum=sum-mx-mi;
        sum=sum/(n-2);
        int ind;
        double mx1=10;
        for(int i=1;i<=n;i++)
        {
            if(fabs(z[i]-sum)<mx1)
            {
                mx1=fabs(z[i]-sum);
                ind=i;
            }
        }
        printf("%d\n",ind);
    }
    return 0;
}

HDU 4521

B

维护一个 i-d的LIS

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

const int N = 100005;
int n, d;
int seq[N];
int alen[N];

void solve() {
    vector<int>vt;
    vector<int>::iterator it;
    int ret = 0;
    for (int i = 1; i <= n; ++i) {
        it = lower_bound(vt.begin(), vt.end(), seq[i]);
        if (it == vt.end()) alen[i] = vt.size()+1;
        else alen[i] = it-vt.begin()+1;
        if (i-d >= 1) {
            if (vt.size() == alen[i-d]-1) vt.push_back(seq[i-d]);
            else if (vt[alen[i-d]-1] > seq[i-d]) vt[alen[i-d]-1] = seq[i-d];
        }
        ret = max(ret, alen[i]);
    }
    printf("%d\n", ret);
}

int main() {
    while (scanf("%d %d", &n, &d) != EOF) {
        for (int i = 1; i <= n; ++i) {
            scanf("%d", &seq[i]);
        }
        solve();
    }
    return 0;
} 

HDU 4522

C

2遍SPFA

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

using namespace std;

#define inf 1000000007
#define MAXN 210
#define ll __int64

int head[MAXN];
bool vis[MAXN];

struct node
{
    int v,next,ok;
}edge[10000010];
int cnt;
char s[10010];
int d0,d1;
int S,T,n,m;
int d[MAXN];
deque<int>q1;
void add(int u,int v,int ty)
{
    edge[cnt].ok=ty;
    edge[cnt].v=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
ll spfa1()   //硬
{
    memset(vis,0,sizeof(vis));
    vis[S]=1;
    q1.push_back(S);
    for(int i=1;i<=n;i++)
        d[i]=inf;
    d[S]=0;
    while(!q1.empty())
    {
        int now=q1.front();
        q1.pop_front();
        vis[now]=0;

        for(int i=head[now];i!=-1;i=edge[i].next)
        {
            int v=edge[i].v;
                if(d[v]>d[now]+1)
                {
                    d[v]=d[now]+1;
                    if(!vis[v])
                    {
                        if(q1.empty())
                            q1.push_back(v);
                        else
                        {
                            if(d[v]<d[q1.front()])
                                q1.push_front(v);
                            else
                                q1.push_back(v);
                        }
                        vis[v]=1;
                    }
                }
        }
    }
    if(d[T]==inf)
        return -1;
    return (ll)d[T]*d0;

}

ll spfa2()   //软
{
    memset(vis,0,sizeof(vis));
    vis[S]=1;
    q1.push_back(S);
    for(int i=1;i<=n;i++)
        d[i]=inf;
    d[S]=0;
    while(!q1.empty())
    {
        int now=q1.front();
        q1.pop_front();
        vis[now]=0;

        for(int i=head[now];i!=-1;i=edge[i].next)
        {
            int v=edge[i].v;
            if(edge[i].ok==1)
            {
                if(d[v]>d[now]+1)
                {
                    d[v]=d[now]+1;
                    if(!vis[v])
                    {
                        if(q1.empty())
                            q1.push_back(v);
                        else
                        {
                            if(d[v]<d[q1.front()])
                                q1.push_front(v);
                            else
                                q1.push_back(v);
                        }
                        vis[v]=1;
                    }
                }
            }

        }
    }
    if(d[T]==inf)
        return -1;
    return (ll)d[T]*d1;

}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));
        cnt=0;
        for(int i=1;i<=m;i++)
        {
            int ty;
            scanf("%s %d",s,&ty);
            int len=strlen(s);
            int a;
            a=0;
            int j;
           // printf("%s\n",s);
            for(j=0;j<len;j++)
            {
               if(s[j]==‘+‘)
                    break;
               a=a*10+s[j]-‘0‘;
            }
            int b=0;

            for(j++;j<len;j++)
            {
                if(s[j]==‘+‘)
                {
                  //  printf("%d %d\n",a,b);
                    add(a,b,ty);
                    a=b;
                    b=0;
                }
                else
                {
                    b=b*10+s[j]-‘0‘;
                }
            }
            add(a,b,ty);
        }
        scanf("%d%d",&d0,&d1);
        scanf("%d%d",&S,&T);
        //printf("111\n");
       /* for(int i=0;i<cnt;i++)
            printf("%d %d\n",edge[i].v,edge[i].ok);
            */
        ll ans1=spfa1();
        ll ans2=spfa2();
        ll ans;

        if(ans1!=-1&&ans2!=-1)
            ans=min(ans1,ans2);
        else
            ans=max(ans1,ans2);
        printf("%I64d\n",ans);
    }
    return 0;
}

HDU 4523

D

3<=m<=n+p

其实可以用double  高精度 java

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

using namespace std;

#define inf 1000000007
#define MAXN 210
#define ll __int64

int main()
{
    double n,m,p;
    while(scanf("%lf%lf%lf",&n,&m,&p)!=EOF)
    {
        if(m<=2)
            printf("NO\n");
        else
        {
            if(p==0)
            {
                if(n==m)
                    printf("YES\n");
                else
                    printf("NO\n");
            }
            else if(n+p>=m)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    return 0;
}

HDU 4524

E

模拟

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

using namespace std;

#define inf 1000000007
#define MAXN 1000010
#define ll __int64

int z[MAXN];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&z[i]);
        int ok=0;
        for(int i=n-1;i>=1;i--)
        {
            if(z[i]>=z[i+1])
            {
                z[i]-=z[i+1];
                z[i+1]=0;
            }
        }
        for(int i=1;i<=n;i++)
            if(z[i])
                ok=1;
        if(ok==1)
            printf("I will never go out T_T\n");
        else
            printf("yeah~ I escaped ^_^\n");
    }
    return 0;
}

HDU 4525

F

sum(n) = sum(n-1)*(k1+k2)

然后判断下  double       ll 会炸

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

using namespace std;

#define inf 1000000007
#define MAXN 210
#define ll __int64

int main()
{
    int t,ca;
    scanf("%d",&t);
    ca=1;
    while(t--)
    {
        int n,k1,k2;
        ll k;
        scanf("%d%d%d%I64d",&n,&k1,&k2,&k);
        double sum=0;
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            sum=sum+a;
        }
        ll ans=0;
        if(sum>k)
            ans=0;
        else
        {
            if(sum==0)
                ans=inf;
            else if(k1+k2>=-1&&k1+k2<=1)
                ans=inf;
            else
            {

                while(sum<=k)
                {
                    sum=sum*(k1+k2);
                    ans++;
                }
            }
        }
        if(ans==inf)
            printf("Case #%d: inf\n",ca++);
        else
            printf("Case #%d: %I64d\n",ca++,ans);
    }
    return 0;
}

HDU 4526

G

dp[i][j]  到第i辆车为止上了j 个人

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

using namespace std;

#define inf 1000000007
#define MAXN 210
#define ll __int64

struct node
{
    int t,num;
}z[MAXN];
int dp[110][110];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k,d,s;
        scanf("%d%d%d%d",&n,&k,&d,&s);
        for(int i=1;i<=k;i++)
            scanf("%d %d",&z[i].t,&z[i].num);
        for(int i=0;i<=k;i++)
        {
            for(int j=0;j<=n;j++)
                dp[i][j]=inf;
        }
        dp[0][0]=0;
        for(int i=1;i<=k;i++)
        {
            for(int j=0;j<=n;j++)
            {
                for(int k=0;k<=z[i].num;k++)
                {
                    dp[i][j]=min(dp[i][j],dp[i-1][j]);
                    if(j<k)
                    {
                        dp[i][j]=min(dp[i][j],j*z[i].t+d);
                    }
                    else
                    {
                        dp[i][j]=min(dp[i][j],dp[i-1][j-k]+k*z[i].t+d);
                    }
                }
            }
        }
        if(dp[k][n]==inf)
            printf("impossible\n");
        else
            printf("%d\n",dp[k][n]);
    }
    return 0;
}

HDU 4527

BFS

加一个时间

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

using namespace std;

#define inf 1000000007
#define MAXN 10
#define ll __int64

int z[MAXN][MAXN];
struct node
{
    int x,y,a,b,step;
};
queue<node>q1;
int s1[4]={1,0,-1,0};
int s2[4]={0,1,0,-1};

int main()
{
    while(scanf("%d",&z[1][1])!=EOF)
    {
        for(int i=2;i<=6;i++)
            scanf("%d",&z[1][i]);
        for(int i=2;i<=6;i++)
        {
            for(int j=1;j<=6;j++)
                scanf("%d",&z[i][j]);
        }
        int m;
        scanf("%d",&m);
        while(m--)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            z[a][b]++;
            if(z[a][b]>4)
            {
                int time=0;
                z[a][b]=0;
                node p;
                p.x=a;
                p.y=b;
                for(int i=0;i<4;i++)
                {
                    p.a=s1[i];
                    p.b=s2[i];
                    p.step=0;
                    q1.push(p);
                }
                while(!q1.empty())
                {
                    while(!q1.empty()&&q1.front().step==time)
                    {
                        node p1=q1.front();
                        q1.pop();
                        int x,y;
                        x=p1.x+p1.a;
                        y=p1.y+p1.b;
                        if(x<1||x>6||y<1||y>6)
                            continue;
                       // printf("time %d x %d  y %d\n",p1.step,x,y);
                        if(z[x][y])
                            z[x][y]++;
                        else
                        {
                            node p2;
                            p2.x=x;
                            p2.y=y;
                            p2.a=p1.a;
                            p2.b=p1.b;
                            p2.step=p1.step+1;
                            q1.push(p2);
                        }

                    }
                    for(int i=1;i<=6;i++)
                    {
                        for(int j=1;j<=6;j++)
                        {
                            if(z[i][j]>4)
                            {
                                z[i][j]=0;
                                node p1;
                                p1.x=i;
                                p1.y=j;
                                p1.step=time+1;
                                for(int k=0;k<4;k++)
                                {
                                    p1.a=s1[k];
                                    p1.b=s2[k];
                                    q1.push(p1);
                                }
                            }
                        }
                    }
                    time++;
                }
            }
        }
        for(int i=1;i<=6;i++)
        {
            for(int j=1;j<6;j++)
                printf("%d ",z[i][j]);
            printf("%d\n",z[i][6]);
        }
        printf("\n");
    }
    return 0;
}

时间: 2024-08-04 17:06:22

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

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

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 "今有物不知其数,三三数之有二,五五数之有三,七七数之有

visual c++ 2013进行MySQL编程(ODBC) -- (一) 套装安装

最近写了有些技术类文章了,只因为最近研究多了些东西,有一些项目用到了,所以自己记录一下,怕自己忘记,如果有哪位同学有自己的见解,可以邮件或者回复,技术类的探讨,不管对否,都是欢迎的. 操作之前,必须安装有Visual Studio 2013,其他的平台,我没有研究,我用的操作系统是Windows 8 Ultimate 64bit. 回到正题,vc数据库编程操作数据库Mysql,使用ODBC驱动接口. 而不是使用Mysql自带的C或者C++接口. 安装数据库,可以下面这个网址这里下载一个大的安装包