当前位置: 首页 > news >正文

【题解】Luogu P5322 [BJOI2019] 排兵布阵

思路

考虑转化为背包问题。将每个玩家视为一组物品,每个城堡的出兵视为一个物品,因为如果要占领该城堡,就要出严格大于对手两倍的兵,所以每个物品的重量为 \(2\times a_i+1\),每个物品的价值为城堡编号。这样题目就转化为了分组背包问题。

但此题不同组的物品并不是相互独立的,如果选取了重量为 \(j\)\(i\) 个物品,其他组重量小于 \(j\) 的第 \(i\) 个物品也同样可以选取。这启示我们从小到大预处理每个物品在不同组的重量。这样我们就能把物品合并,如果 \(j\) 是第 \(i\) 个物品中第 \(k\) 小的重量,那么比 \(j\) 重量小的物品就可以一并被取到,物品可合并为重量为 \(j\)、价值为 \(i\times k\) 的物品。把不同玩家的物品合并,组就变成了城市。

预处理,对每个城堡所有人的出兵进行排序,在背包时枚举 \(k\) 意为前 \(k\) 小即可。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=110;
const int M=20010;
int s,n,m,ans;
int num[N][N],f[M];
//num_i,j:第i城堡,第j大出兵
//f_i,j:第i城堡,已出j兵
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",&num[j][i]);}for(int i=1;i<=n;i++) sort(num[i]+1,num[i]+1+s);for(int i=1;i<=n;i++){for(int j=m;j>=0;j--){for(int k=1;k<=s;k++){if(j>num[i][k]*2) f[j]=max(f[j-(num[i][k]*2+1)]+i*k,f[j]);}}}for(int i=0;i<=m;i++) ans=max(ans,f[i]);printf("%d\n",ans);return 0;
}

时间复杂度 \(O(nms)\)

http://www.jsqmd.com/news/79200/

相关文章:

  • 代码源挑战赛 Round 41
  • 详细介绍:NumPy / pandas 类型选型、内存占用与性能优化
  • 告别选择困难!2025年远程控制软件场景化终极横评
  • 一种可落地的任务令牌锁机制:设计原理、实战经验与容器化演进
  • [JSK]二叉苹果树
  • 【题解】Luogu P8137 [ICPC2020 WF] ’S No Problem
  • Day 36 官方文档的阅读
  • 青少年编程学习:考级与竞赛如何平衡
  • 2025 Autel MaxiVCI V150 Wireless Dongle: CAN FD/DOIP for Autel 900 Series Scanners
  • 【UI Qt】入门笔记
  • WSL安装方法
  • Ubuntu环境中LLaMA Factory 的部署与配置—构建大语言模型微调平台 - 实践
  • 2025贵阳公墓/公益公墓top5推荐!贵阳优质生态陵园榜单发布,合规保障与人文关怀兼具的安息之所推荐 - 全局中转站
  • 【题解】Luogu P2354 [NOI2014] 随机数生成器
  • 基于Django的农场管理系统
  • rsync交叉编译步骤
  • 下载UCI数据集《Secondary Mushroom》
  • 【题解】P11453 [USACO24DEC] Deforestation S
  • 03 以上版本 Excel 文件解压替换图片
  • 【题解】Luogu P13977 数列分块入门 2
  • AI核心知识50——大语言模型之Scaling Laws(简洁且通俗易懂版)
  • MySQL 深分页查询优化实践与经验总结
  • P2014 [CTSC1997] 选课
  • 彻底讲清 MySQL InnoDB 锁机制:从 Record 到 Next-Key 的全景理解
  • 超越宣传:基于数据与案例的软件人才外包服务商价值评估指南
  • MCU的启动流程你了解么?
  • 电机多目标优化与灵敏度分析:探索电机性能提升之道
  • I2C通信最全面的讲解:从协议到硬件设计
  • 打造下一个爆款!专业短剧APP全栈开发解决方案,解锁万亿级市场红利
  • 毕业论文选题AI推荐:9大工具+热门方向合集