250 pts #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <string> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <algorithm> using namespace std; #define MAXN 55 int isOk(string a,string b){ int len=a.length(); int i; for(i=0;i<len;i++) if(a[i]!=b[i]) return 0; return 1; } class TheLotteryBothDivs { public: double find(vector <string> good) { double ret=0; double f[12]; int n=good.size(); int i,j; f[1]=0.1; for(i=2;i<=9;i++) f[i]=f[i-1]/10.0; for(i=0;i<n;i++) reverse(good[i].begin(),good[i].end()); sort(good.begin(),good.end()); int col[MAXN]; memset(col,0,sizeof(col)); for(i=j=1;i<n;i++) if(good[i]!=good[i-1]) good[j++]=good[i]; n=j; for(i=0;i<n;i++) if(col[i]==0){ for(j=i+1;j<n;j++) if(isOk(good[i],good[j])) col[j]=1; } for(i=0;i<n;i++) if(col[i]==0){ int len=good[i].length(); if(len>9) continue; ret+=f[len]; } return ret; } }; 500 pts #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <string> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <algorithm> using namespace std; int dp[52][100003]; #define _max(a,b) ((a)>(b)?(a):(b)) struct node{ int m,p,r; }f[52]; bool comp(node a,node b){ return ((long long)a.r*b.p)<((long long)a.p*b.r); } class TheProgrammingContestDivOne { public: int find(int T, vector <int> maxP, vector <int> pP, vector <int> rT) { int n=maxP.size(); int i,j; for(i=0;i<n;i++){ f[i].m=maxP[i]; f[i].p=pP[i]; f[i].r=rT[i]; } sort(f,f+n,comp); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++){ for(j=0;j<=T;j++){ dp[i][j]=dp[i-1][j]; if(j-f[i-1].r>=0){ long long tmp=(long long )f[i-1].m-(long long)j*f[i-1].p; if(tmp<0) tmp=0; dp[i][j]=max(dp[i][j],dp[i-1][j-f[i-1].r]+(int)tmp); } } } int ret=0; for(i=0;i<=T;i++) if(dp[n][i]>ret){ ret=dp[n][i]; } return ret; } };