[洛谷P5322][BJOI2019][题解]排兵布阵

0.咕

国庆假期就这么过去了呢
原题

1.解法

发现对于每一个城堡,一个对手被攻陷后所有比他小的都会被攻陷,于是我们先对对手的兵力排序。
此时在这\(s\)个对手里,第\(i\)个对手的攻陷代价为\(2\times a_i+1\),攻陷后获得的价值为\(i\times k\)
每个城堡\(s\)个对手,选一个攻打,这是啥不用说了吧。

2.代码

#define N 110
#define M 20010
int s,n,m,a[N][N],f[M];
int main(){
	Read(s),Read(n),Read(m);
	for(rg int i=1;i<=s;i++){
		for(rg int j=1;j<=n;j++){
			Read(a[j][i]);
		}
	}
	for(rg int i=1;i<=n;i++){
		sort(a[i]+1,a[i]+1+s);
		for(rg int j=1;j<=s;j++)a[i][j]=a[i][j]*2+1;
	}
	for(rg int i=1;i<=n;i++){
		for(rg int j=m;j>=0;j--){
			for(rg int k=1;k<=s;k++){
				if(j>=a[i][k]){
					f[j]=max(f[j],f[j-a[i][k]]+i*k);
				}
			}
		}
	}
	cout<<f[m]<<endl;
	return 0;
}

3.完结撒花

又水了一篇题解真好

posted @ 2020-10-06 11:03  ajthreac  阅读(159)  评论(1编辑  收藏  举报