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