P5322 排兵布阵解题报告
本想在洛谷上交篇题解的,结果发现交不了,所以只能在这边写了。。。
作为一个蒟蒻,看到省选题,第一眼考虑怎么打暴力
我们可以分情况考虑
- 当\(s==1\)的时候
我们可以把他当成一个\(01\)背包,背包总体积为m,每个城堡为每一件物品,他的价值为 \(i\) 及他的编号,他的体积为 \(2*\) 派兵的人数加一(保证严格大于其他玩家派兵的人数)。这样跑一遍\(01\)背包不就完事了吗 QAQ。。。。
这样你就会拿到 40-50pts。但作为蒟蒻的我,已经很满足了。。。
2.其他情况,不会写QAQ。。。
附上 40-50pts 代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,s,v;
int f[20010],c[110][110],w[110][110];
void slove2()
{
for(int i = 1; i <=s; i++)//枚举人数
{
for(int j = 1; j <= n; j++)//枚举城堡数
{
scanf("%d",&v);
c[j][i] = 2*v+1;
w[j][i] = j;
}
}
for(int i = 1; i <= n; i++)//01背包
{
for(int j = m; j >= 0; j--)
{
f[j] = f[j-c[i][k]] + w[i][k];
}
}
if(s == 1) printf("%d\n",f[m]);
}
int main()
{
scanf("%d%d%d",&s,&n,&m);
slove2();
return 0;
}
但在经过神犇指导后,我思考出这样一个优化。
当我们往一个城堡派兵数量为 \(v\)时,那么小于\(v\)的其他人都会被打败,也就是出兵比我们少的,都会的打败。假设出兵比我们少的人为 \(p\) 那么你就可以获得 \(i\) * \(p\) 的分数。\(i\)为城堡编号。
我们可以通过排序加快这一过程,这样我们得到了每件物品的价值和体积。
但这时不再是个\(01\)背包,而是个分组背包。我们可以把每个城堡当做一组,
每个城堡,你可以放s种选择,来打败玩家,但每种选择只能选一种。
这不就是个妥妥的分组背包了吗???
综上,这个题的大体思路就是,通过派兵人数从大到小排序处理出每件物品的价值和体积。 物品的体积就是\(2*\)派兵人数+\(1\) 价值就是 \(i*\) 比他小的数的个数(因为排序保证前边的出兵人数都是比他小的)。最后跑一遍分组背包,就可以轻松AC了这道题。
附上AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,s,v;
int f[20010],c[110][110],w[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",&c[j][i]);
}
}
for(int i = 1; i <= n; i++)
{
sort(c[i]+1,c[i]+s+1);//按出兵人数排序
for(int j = 1; j <= s; j++)
{
c[i][j] = c[i][j] * 2 + 1;
w[i][j] = i * j;//他的价值为在这个城堡比他派兵少的人数*这个城堡的编号
}
}
for(int i = 1; i <= n; i++)//分组背包的模板
{
for(int j = m; j >= 0; j--)
{
for(int k = 1; k <= s; k++)
{
if(j - c[i][k] >= 0)
{
f[j] = max(f[j],f[j-c[i][k]] + w[i][k]);
}
}
}
}
printf("%d\n",f[m]);
return 0;
}
本人码风过丑,请各位大佬不要喷QAQ。。。
由于作者是个菜鸡,可能无法解释清楚这道题,请见谅。。。。。
P5322 排兵布阵解题报告的更多相关文章
- ACM: 敌兵布阵 解题报告 -线段树
敌兵布阵 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description Li ...
- hdu 1166 敌兵布阵 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目意思:给出 N 个数你,通过对某些数进行更改(或者 + 或者 -),当输入的是 Query ...
- HDU 4539郑厂长系列故事――排兵布阵(状压DP)
HDU 4539 郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...
- HDU 4539 郑厂长系列故事——排兵布阵
http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) ...
- 郑厂长系列故事——排兵布阵 hdu4539(状态压缩DP)
郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)To ...
- [BJOI2019]排兵布阵——分组背包
题目链接: [BJOI2019]排兵布阵 对于每座堡垒,将$s$个对手排序,显然如果安排的兵力能打败第$i$个对手就一定能打败前$i-1$个. 那么对于第$i$座城堡,可以看做有$s+1$个物品(可以 ...
- [BJOI2019]排兵布阵(动态规划)
[BJOI2019]排兵布阵(动态规划) 题面 洛谷 题解 暴力dp: 设\(f[i][j]\)表示考虑到了第\(i\)座城市用了\(j\)人的最大收益,枚举在这个城市用多少人就可以了. 优化: 发现 ...
- HDU-4539郑厂长系列故事——排兵布阵(状态压缩,动态规划)
郑厂长系列故事--排兵布阵 Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total ...
- HDU 4539 郑厂长系列故事——排兵布阵 状压dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/O ...
随机推荐
- Fitness - 05.23
倒计时222天 运动40分钟,共计8组,4.2公里.拉伸10分钟. 每组跑步3分钟(6.5KM/h),走路2分钟(5.5KM/h). 终于赶在姨妈前完成第3周的跑步训练了,可喜可贺~~ 下周预计要休息 ...
- ACwing 你能回答这些问题吗(线段树求最大连续字段和)
给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“1 x y”,查询区间 [x,y] 中的最大连续子段和,即 maxx≤l≤r≤ymaxx≤l≤r≤y{∑ri=lA[i]∑i=l ...
- 04router
1.以 / 开头的嵌套路径会被当作根路径.一级路由可以放在二级router-view里面 实现的效果是页面嵌套 { path: '/console', name: 'console', compone ...
- 深入理解 IoC、DI
本文转载自博客:https://www.cnblogs.com/xinhuaxuan/p/6132372.html 1.控制反转:谁控制谁?控制什么?为何叫反转(对应于正向)?哪些方面反转了?为何需要 ...
- Java实现随机生成由字母、数字组合的N位随机数
通过Math.random函数生成所需的字符所有序列,通过判断当前字符是否属于大小写.数字,符合者加入数组内,直到数组存储N位为止,最后把当前数组转为字符串返回调用处. /** * 随机生成由数字.字 ...
- Linux:网络基础配置
一.修改主机名 hostname 查看主机名 1.hostname zy 修改主机名为zy,临时生效,重新登录系统生效. 2.想要永久修改,,需修改配置文件: vi /etc/sysconf ...
- lua数据结构之table的内部实现
一.table结构 1.Table结构体 首先了解一下table结构的组成结构,table是存放在GCObject里的.结构如下: typedef struct Table { CommonH ...
- oracle之二redo日志
redo 日志 4.1 redo (重做) log 的功能:数据recovery4.2 redo log 特征: 1)记录数据库的变化(DML.DDL) 2)用于数据块的recover ...
- 小程序开发-iView Weapp微信小程序UI组件库入门使用
iView Weapp UI组件库 今天来试试iView Weapp 这个微信小程序组件库,看看好不好用~~ 官网地址: http://inmap.talkingdata.com/wx/index_p ...
- 宝塔linux部署node项目
1.安装宝塔linux之后,按需配置,我的是nginx,不是apq的. 2.下载pm2管理器 3.添加站点,将node项目从localhost打包到到站点,node_modules这个无需打包,这个依 ...