250pts #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 52 long long f[MAXN]; long long num[MAXN][2]; long long sum[MAXN]; class SlimeXSlimesCity { public: int merge(vector <int> pop) { int n=pop.size(); sort(pop.begin(),pop.end()); num[0][0]=pop[0]; num[0][1]=1; int i,j; for(i=1,j=0;i<n;i++) if(pop[i]!=pop[i-1]){ num[++j][0]=pop[i]; num[j][1]=1; } else num[j][1]++; sum[0]=num[0][0]*num[0][1]; int len=j; int res=0; for(i=1;i<=len;i++) sum[i]=sum[i-1]+num[i][0]*num[i][1]; res=num[len][1]; for(i=len-1;i>=0;i--){ long long tmp=sum[i]; int flag=1; for(j=i+1;j<=len;j++) if(tmp>=num[j][0]){ tmp+=num[j][0]*num[j][1]; } else{flag=0;break;} if(flag) res+=num[i][1]; } return res; } }; 600pts,二分图最佳匹配,为什么总是在别人的提示下才会想得到,太弱了 #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 #define inf 1000000000 #define _clr(x) memset(x,0xff,sizeof(int)*n) int kuhn_munkras(int m,int n,int mat[][MAXN],int* match1,int* match2){ int s[MAXN],t[MAXN],l1[MAXN],l2[MAXN],p,q,ret=0,i,j,k; for (i=0;i<m;i++) for (l1[i]=-inf,j=0;j<n;j++) l1[i]=mat[i][j]>l1[i]?mat[i][j]:l1[i]; for (i=0;i<n;l2[i++]=0); for (_clr(match1),_clr(match2),i=0;i<m;i++){ for (_clr(t),s[p=q=0]=i;p<=q&&match1[i]<0;p++) for (k=s[p],j=0;j<n&&match1[i]<0;j++) if (l1[k]+l2[j]==mat[k][j]&&t[j]<0){ s[++q]=match2[j],t[j]=k; if (s[q]<0) for (p=j;p>=0;j=p) match2[j]=k=t[j],p=match1[k],match1[k]=j; } if (match1[i]<0){ for (i--,p=inf,k=0;k<=q;k++) for (j=0;j<n;j++) if (t[j]<0&&l1[s[k]]+l2[j]-mat[s[k]][j]<p) p=l1[s[k]]+l2[j]-mat[s[k]][j]; for (j=0;j<n;l2[j]+=t[j]<0?0:p,j++); for (k=0;k<=q;l1[s[k++]]-=p); } } for (i=0;i<m;i++) ret+=mat[i][match1[i]]; return ret; } int getValue(char c){ if(c>='0'&&c<='9') return (c-'0'+1); if(c>='a'&&c<='z') return (c-'a'+11); if(c>='A'&&c<='Z') return (c-'A'+37); } class SlimeXGrandSlimeAuto { public: int travel(vector <int> cars, vector <int> dist, vector <string> roads, int Walk, int Drive) { int m=cars.size(); int n=roads.size(); int mat[MAXN][MAXN]; int road[MAXN][MAXN]; memset(road,-1,sizeof(road)); int i,j,k; for(i=0;i<n;i++) for(j=0;j<n;j++) if(roads[i][j]!='.'){ road[i][j]=getValue(roads[i][j]); } for(k=0;k<n;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) if(road[i][k]!=-1&&road[k][j]!=-1){ if(road[i][j]==-1) road[i][j]=road[i][k]+road[k][j]; else if(road[i][j]>road[i][k]+road[k][j]) road[i][j]=road[i][k]+road[k][j]; } int drive[MAXN][MAXN]; memset(drive,-1,sizeof(drive)); for(k=0;k<m;k++){ i=cars[k]; for(j=0;j<n;j++) if(road[i][j]!=-1) drive[i][j]=road[i][j]*Drive; } for(i=0;i<n;i++) for(j=0;j<n;j++){ if(road[i][j]!=-1) road[i][j]*=Walk; if(i==j) road[i][j]=0; } memset(mat,0,sizeof(mat)); int d=dist.size(); for(i=0;i<m;i++){ if(drive[cars[i]][dist[0]]!=-1&&road[0][cars[i]]!=-1){ if(road[0][dist[0]]-drive[cars[i]][dist[0]]-road[0][cars[i]]>0) mat[i][0]=road[0][dist[0]]-drive[cars[i]][dist[0]]-road[0][cars[i]]; } for(j=1;j<d;j++) if(drive[cars[i]][dist[j]]!=-1&&road[dist[j-1]][cars[i]]!=-1){ if(road[dist[j-1]][dist[j]]-drive[cars[i]][dist[j]]-road[dist[j-1]][cars[i]]>0) mat[i][j]=road[dist[j-1]][dist[j]]-drive[cars[i]][dist[j]]-road[dist[j-1]][cars[i]]; } } int ret=0; int pre=0; for(i=0;i<d;i++){ ret+=road[pre][dist[i]]; pre=dist[i]; } int match1[MAXN],match2[MAXN]; ret-=kuhn_munkras(m,50,mat,match1,match2); return ret; } };