P5322 [BJOI2019] 排兵布阵

news/2025/10/28 19:52:27/文章来源:https://www.cnblogs.com/qwqSW/p/19172532

题目传送门

博客传送门

我们浏览一遍测试点,发现了一个 \(s=1\) 的特殊性质。先考虑这一性质。

\(s=1\)特殊性质

如果我们当前第 \(i\) 座城市的兵力数量足够时,添加兵力显然不优。而如果兵力不够,我们的最优策略挺显然的,要么添加兵力使其恰好足够,要么干脆就不要这个城市。

换句话说,我们对一个城市的决策只有选与不选两种,选的话需要花费一定的体积,同时获得一定的价值。

听我这么一描述,是不是感觉这就是个很板的01背包?对的对的,这个部分分就是个01背包板子……忘记01背包的可以移步01背包基础

而那个兵力限制 \(m\),往这个方向上考虑,其实就是个背包最大容量 \(V\)

特殊性质代码也贴在这里,希望有助于大家理解。

P5322特殊性质
#include<bits/stdc++.h>
#define int long long
using namespace std;inline int read(){int x=0,f=1;char c=getchar();while(c<48){if(c=='-') f=-1;c=getchar();}while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}const int N=120;
const int M=2e4+4;
int S,n,m,w[N],v[N],dp[M];signed main(){S=read(),n=read(),m=read();int W=m;//不同于我当时的博文,这里的w数组是代价,v数组是价值 for(int i=1;i<=n;i++){int x=read();//根据题意,第i座城市恰巧被占领的兵力是2*a[i]+1 w[i]=((x<<1)|1),v[i]=i;}//01背包模版 for(int i=1;i<=n;i++){for(int j=W;j>=w[i];j--){dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}}int ans=dp[m];printf("%lld",ans);return 0;
}

正解

那既然这个部分分是个背包dp,我们合理猜测本题也是个dp,搞不好还是背包dp。

我们要用同一套队形一次性对战这 \(s\) 个人,一共 \(ns\) 场对决。我们在某场对决里的决策不会影响到其他的对决,它们是独立的。所以我们还是可以按01背包的思想,把这 \(ns\) 场对决拆成 \(ns\) 件物品,然后进行01背包,时间复杂度 \(O(nms)\)

刚才的是一种做法。另一种做法是分组背包。简单来说,既然对决是独立的,我们对于某座城池,首先可以将 \(s\) 个人的驻守兵力从小到大排序。记排序后的数组为 \(b\)

接下来的过程类似于你做题时拿部分分。

P5322_1_1

P5322_2_1

对于某个城市 \(i\),因为 \(b_1 \le b_2 \le \cdots b_s\) ,所以如果我们现在的驻扎兵力刚好可以拿下 \(b_j\) 的话,那它一定能且只能拿下 \(b_1,b_2,\cdots,b_j\)

所以我们拆物品方法有所不同:对于\(i\) 城市兵力第 \(j\) 小的那个对应得物品,我们让它的体积是 \(2*b_j+1\),价值是 \(j \times i\),如上图所示。

(类似于你拿部分分,除非特殊性质,否则你拿到越靠后的分,用的时间一般越长,但拿到的分值也会越高。而且你能解决后面的部分分,也就能解决前面的部分分)

就像你做题的时候,一道题目只会有一个得分,对于 \(i\) 城市,贡献只能有一个,所以这个分组背包的组就是每个城市,里面的物品就是刚才拆出来的 \(s\) 个。我们只能选择一个物品的价值作为这个城市的最终贡献。

总之分析到这里,本题就是个很板的背包dp,仅此而已。

代码:

P5322
#include<bits/stdc++.h>
#define int long long
using namespace std;inline int read(){int x=0,f=1;char c=getchar();while(c<48){if(c=='-') f=-1;c=getchar();}while(c>47) x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}const int N=120;
const int M=2e4+4;
int S,n,m,w[N],v[N],dp[M],a[N][N],b[N],W[N][N],V[N][N],DP[N][M];signed main(){S=read(),n=read(),m=read();for(int i=1;i<=S;i++){for(int j=1;j<=n;j++){a[i][j]=read();}}//拆分物品 for(int i=1;i<=n;i++){for(int j=1;j<=S;j++){b[j]=a[j][i];}sort(b+1,b+S+1);for(int j=1;j<=S;j++){W[i][j]=2*b[j]+1,V[i][j]=i*j;}}//分组背包 for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){for(int k=0;k<=S;k++){//k=0时的物品价值是0,代价是0,相当于根本不要i城市的情况 if(j>=W[i][k]){DP[i][j]=max(DP[i][j],DP[i-1][j-W[i][k]]+V[i][k]);}}}}int ans=DP[n][m];printf("%lld",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/949096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:P9292 [ROI 2018] Robomarathon

题目传送门 题目大意: 有 \(N\) 名机器人选手参加马拉松,选手编号为 \(1 \dots N\),分道编号也为 \(1 \dots N\)。选手 \(i\) 占据分道 \(i\),跑完全程需要 \(a_i\) 秒。设 \(S \subseteq \{1, 2, \dots, N\}\) 表…

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

P5322 [BJOI2019] 排兵布阵 我们可以预处理出第 \(i\) 个城堡分配 \(j\) 的兵力能获得多少的得分,记为 \(w[i][j]\)。 则每一个 \(w[i]\) 都是一个泛化物品,即价值(\(w[i][j]\))随着分配体积(\(j\))变化的物品。…

申威服务器安装Nacos 2.0.3 RPM包详细步骤(Kylin V10 sw_64架构)​附安装包

申威服务器安装Nacos 2.0.3 RPM包详细步骤(Kylin V10 sw_64架构)​附安装包​ Nacos 2.0.3-1.ky10.sw_64.rpm​ 是专为 ​申威(SW)架构​ 处理器,并运行 ​中标麒麟操作系统 Kylin V10(64位)​​ 的服务器环境定…

ZKY精选冲刺省选国赛仿真训练题

求和 QOJ - 9902 解题思路 代码实现点击查看代码Bridges AtCoder - arc143_d 解题思路 代码实现点击查看代码龙门考古 UniversalOJ - 840 解题思路 代码实现点击查看代码Discrete Centrifugal Jumps CodeForces - 1407…

MySQL 查询与更新语句执行过程深度解析:从原理到实践​ - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ZKY精选冲刺省选国赛技巧训练题

Discrete Centrifugal Jumps CodeForces - 1407D 解题思路 代码实现点击查看代码序列妙妙值 UniversalOJ - 549 解题思路 代码实现点击查看代码Constrained Sums AtCoder - abc277_h 解题思路 代码实现点击查看代码ag…

逆向基础--编码(001)

逆向基础--编码(001)一.位与字节比特(Bit):1比特就是1位,每个0或1就是一个位,位是数据存储的最小单位。位是二进制表示,8位二进制是一个字节。 8位二进制(就是8个比特)最大:11111111字节(Byte):字节是通过网…

20251027 - 倍增 ST表

前言: 怎么标题改来改去的? 概念 因为每一个整数都可以转换成对应的二进制,所以可以表示成 \(a_0 \times 2^0 + a_1 \times 2 ^ 1 + a_2 \times 2 ^ 2 + a_{len} \times 2 ^ {len}\)。 因此,对于求跳 \(x\) 步后的…

周康阳精选冲刺省选国赛思维训练题

agc052_a Long Common Subsequence 解题思路 代码实现点击查看代码agc052_a Long Common Subsequence 解题思路 代码实现点击查看代码agc052_a Long Common Subsequence 解题思路 代码实现点击查看代码agc052_a Long C…

Luogu P7913 [CSP-S 2021] 廊桥分配 题解 [ 绿 ] [ 贪心 ] [ 前缀和 ] [ STL ]

廊桥分配 笑点解析:VP 的时候想这题想了 20min,比想 T3 的时间长。 关键结论:在不考虑廊桥限制的情况下,给每个飞机分配一个最小的廊桥编号。当最终廊桥数目大于等于其对应编号时,飞机才能被分配到廊桥。 理解起来…

10-27 CSP 赛前比赛记录

DNA 序列(DNA)哈希题啊,但是忘了怎么写哈希了 qwq,所以…… 思路大概就是维护一个长度为 \(k\) 的四进制数,类似于一个滑动窗口,就是除以 \(4\) 后加上右边新加的数乘上 \(4^k\),就可以得到其对应的哈希值,取模…

P3939 数颜色

这道题是暑假写的。但是当时数据结构学傻了,写了个莫队。 然后刚刚发现没过,连忙重新看题。 想了想发现跟可以跟Ynoi有一道区间众数题一个思路处理一下,直接二分就完了。 就记录一下每个数的出现次数。这里还有个小…

完整教程:Docker 搭建 Nginx 并启用 HTTPS 具体部署流程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AI开发微信小程序-有感

我先有一版html代码(有一个个人网站,里面都是一些在线使用的工具) 抽取出了其中一个小功能,让AI根据现有html代码直接转成小程序 直接拿过来在微信小程序开发IDE上,进行测试 稍微调整一下,就OK了。 AI真的是太有…

价值流智能时代:DevOps平台如何成为企业高效交付的核心引擎? - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年压力容器品牌综合实力排行榜

文章摘要 随着化工、石油、能源等行业的快速发展,压力容器作为核心设备在工业生产中扮演着越来越重要的角色。2025年压力容器行业将更加注重技术创新、安全性能与环保标准,头部企业通过智能化制造与定制化服务持续提…

2025年压力容器厂家综合评测与选择指南

摘要 随着化工、石油、能源等行业的快速发展,压力容器作为核心设备在工业生产中扮演着越来越重要的角色。2025年压力容器行业将更加注重技术创新、安全性能和服务质量,市场竞争也日趋激烈。本文基于行业数据和技术参…

2025年口碑好的压力容器工厂/厂家前十强

文章摘要 压力容器行业在化工、石油、动力及食品等领域持续增长,2025年预计全球市场规模将达千亿美元,驱动因素包括工业自动化升级和环保要求提升。本文基于行业数据、用户口碑和技术参数,综合评测前十品牌,并提供…

AI Agent 从零到百万价值迭代之路 - 智慧园区

这个时代Agent的本质:用精心设计的prompt作为"控制语句",用LLM作为"解释器",构建一个能处理模糊输入的动态系统-互联网创业老兵大模型时代为什么是革命 经过了近2年的Agent开发,在法律、工业、…