CF1316E Team Building 题解
jiangtaizhe001 · · 题解
可能更好的阅读体验
题目传送门
题目大意
传送门
你需要组建一支排球队。为了组织一支排球队,你需要为队伍里的
对于第
题目解析
CF 2300,好像也不是很难,评紫题过分了昂
显然把上场的队员选定之后,那么剩下的肯定是选择贡献大的当做观众。
那么就把所以人作为观众的贡献降序排序,考虑在这个序列上 DP。
int n,p,m,msk;
struct JTZ{
int au,pl[maxm];
bool operator < (const JTZ x) const {
return this->au > x.au;
}
}a[maxn];
ll f[2][139];
int main(){
n=read(); p=read(); m=read(); msk=(1<<p)-1; int i,j,k,now; for(i=1;i<=n;i++) a[i].au=read();
for(i=1;i<=n;i++) for(j=0;j<p;j++) a[i].pl[j]=read();
sort(a+1,a+n+1); for(i=1;i<=m;i++) f[0][0]+=a[i].au;
for(i=1;i<=n;i++) for(j=0;j<=msk;j++){
now=0; f[i&1][j]=f[(i&1)^1][j]; for(k=0;k<p;k++) if(j&(1<<k)) now++;
for(k=0;k<p;k++) if(j&(1<<k)){
if(i>m+now) f[i&1][j]=mmax(f[i&1][j],f[(i&1)^1][j^(1<<k)]+a[i].pl[k]);
else f[i&1][j]=mmax(f[i&1][j],f[(i&1)^1][j^(1<<k)]+a[i].pl[k]-a[i].au+a[m+now].au);
}
} print(f[n&1][msk]); return 0;
}