腾讯编程马拉松初赛第一场(2013.3.20)

题目地址:http://wenku.baidu.com/view/bb74cced9b89680203d825f2.html

总体偏容易,看看代码基本就搞懂了。

1001

简单题,代码略。

 

1002

背包问题的一个变形,参看《背包九讲》:http://wenku.baidu.com/view/519124da5022aaea998f0f22.html

View Code
#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <stack>
#include <vector>

#define FOR(i,s,e) for (int i=(s); i<(e); i++)
#define FOE(i,s,e) for (int i=(s); i<=(e); i++)
#define FOD(i,s,e) for (int i=(s)-1; i>=(e); i--)
#define CLR(a,x) memset(a, x, sizeof(a))
#define SIZE(v) ((int)(v).size())
#define FOREACH(i,v) for(typeof((v).begin()) i=(v).begin();i!=(v).end();i++)
typedef long long ll;
using namespace std;

int f[101][101][101][6];

int main(){
#ifndef ONLINE_JUDGE
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
#endif
    int n,v1,v2,k,a,b,val;
    while (cin>>n>>v1>>v2>>k){
        CLR(f,0);
        FOE(j,1,n){
            cin>>a>>b>>val;
            FOE(i1,0,v1)
                FOE(i2,0,v2)
                    FOE(kk,0,k){
                        f[j][i1][i2][kk]=f[j-1][i1][i2][kk];
                        if (i1>=a && f[j][i1][i2][kk]<f[j-1][i1-a][i2][kk]+val)
                            f[j][i1][i2][kk]=f[j-1][i1-a][i2][kk]+val;
                        if (i2>=b && f[j][i1][i2][kk]<f[j-1][i1][i2-b][kk]+val)
                            f[j][i1][i2][kk]=f[j-1][i1][i2-b][kk]+val;
                        if (kk>=1 && f[j][i1][i2][kk]<f[j-1][i1][i2][kk-1]+val)
                            f[j][i1][i2][kk]=f[j-1][i1][i2][kk-1]+val;
                    }
        }
        cout<<f[n][v1][v2][k]<<endl;
    }
    return 0;
}

 

1003

简单dp题,代码略。

 

1004

比赛时没想出来,看了别人代码才搞明白,方法很巧妙,谢谢tantian的代码。

View Code
#include <cstdio>
#include <vector>
#include <iostream>

using namespace std;

int n;
double ans;

int main(){
    int test=0;
    scanf("%d", &test);
    for (int T=0; T<test; ++T){
        scanf("%d", &n);
        ans=n;
        ans=ans*(n-1)*(n-2)/6;
        double tt=ans, s=0;
        for (int i=0; i<n; ++i){
            int x;
            scanf("%d", &x);
            double t=x;
            t=t*(n-t-1);
            s+=t;
        }
        ans=ans-s/2;
        printf("%.3f\n", ans/tt);
    }
}

 

1005

比赛时以为是排列组合题,没仔细看,其实是个简单dp。

View Code
#include <cstdio>
#include <vector>
#include <iostream>

using namespace std;

int T;
int a,b;
unsigned long long f[50][300];

int main(){
    while (scanf("%d %d %d", &a, &b, &T)==3){
        int need=b-a+1;
        int can=T/30;
        T=T%30;
        need=need+can;
        if (T>=15) ++can;
        if (need<0) need=0;
        for (int i=0; i<=can; ++i)
            for (int j=0; j<=need; ++j)
                f[i][j]=0;
        f[0][0]=1;
        for (int i=0; i<can; ++i)
            for (int j=0; j<=need; ++j)
                if (f[i][j]){
                    //printf("%d %d\n", i,j);
                    for (int k=1; k<=3; ++k){
                        int t=j+k;
                        if (t>need) t=need;
                        f[i+1][t]+=f[i][j];
                    }
                }
        cout<<f[can][need]<<endl;
    }
}

 

posted on 2013-03-30 11:43  wujie27  阅读(153)  评论(0编辑  收藏  举报