洛谷P5322 [BJOI2019] 排兵布阵

题目大意

有s名对手,n座城堡,你有m名士兵

如果一名玩家向第 i 座城堡派遣的士兵数严格大于对手派遣士兵数的两倍,那么这名玩家就占领了这座城堡,获得 i 分。

求最大得分

数据范围

对于 10% 的数据: s=1,n3,m10

对于 20% 的数据: s=1,n10,m100

对于 40% 的数据: n10,m100

对于另外 20% 的数据: s=1

对于 100% 的数据:

1s100
1n100
1m20000

对于每名玩家 ai0i=1naim


题解

不难想到用背包的方法去解决这道题

设第 i 座城堡派出兵力第 k 多的玩家派出了 a[i][k]名士兵

对于每座城堡的代价,一定是 a[i][k]×2+1,因为题目中是严格大于,所以要 +1

如果派出兵力大于了 a[i][k]×2+1,那多余的一定是浪费的

对于 a[i][k],我们只需要在一开始将 a 数组排序即可

dp 转移方程即为: dp[j]=max(dp[ja[i][k]×21]+k×i,dp[j])

#include<bits/stdc++.h>
using namespace std;
int s,n,m,dp[20010],ans,a[110][110];
int main(){
	scanf("%d%d%d",&s,&n,&m);
	for(int i = 1;i<=s;i++)
		for(int j = 1;j<=n;j++)
			scanf("%d",&a[j][i]);
	for(int i = 1;i<=n;i++)
		sort(a[i]+1,a[i]+s+1);
	for(int i = 1;i<=n;i++)
		for(int j = m;j>=0;j--)
			for(int k = 1;k<=s;k++)
				if(j>a[i][k]*2)
					dp[j] = max(dp[j],dp[j-a[i][k]*2-1]+i*k);
	for(int i = 0;i<=m;i++) ans = max(ans,dp[i]);
	printf("%d",ans);
	return 0;
}
posted @   cztq  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示