腾讯编程马拉松初赛第一场(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;
    }
}

 

转载于:https://www.cnblogs.com/wujie27/archive/2013/03/30/2990203.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值