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 ...
随机推荐
- 利用 Python 写个七夕表白神器
今天是七夕节,相比于现代人自创的 502,不对是 520,七夕才是中国传统意义上的情人节,本文分享几个 Python 表白程序,情侣可以现学现用,单身的话也可以先收藏一下,说不定下次就用上了. 很多人 ...
- 初级知识点一——C#中的值类型与引用类型
从C#语言的定义中可以知道,C#支持两种值类型,分别是 值类型和引用类型,那么两者的区别到底在哪儿呢? 值类型特点: 1. 值类型包含 a 预定义的值类型 b 用户自定义的值类型(struct) 2. ...
- mysql5.7.29- windows64安装教程
1.配置环境变量 MYSQL_HOME=D:\tools\mysql-5.7. path=%MYSQL_HOME%\bin 2.执行mysqld --initialize-insecure --use ...
- Java8 ParallelStream
ParallelStream 并行流就是一个把内容拆分成多个数据块,用不同线程分别处理每个数据块的流.对收集源调用parallelStream方法就能将集合转换为并行流. 并行流 并行流和顺序流转换 ...
- 一招教你如何用Word直接打开PDF进行编辑,无需下载转换软件
我们都知道PDF是无法轻易修改的文档格式,市面上就出现了许多收费的如WPS等各种收费转换软件,免费的转换就只能转换几页,实属坑腰包,经过一番查找,终于发现Word可以直接打开PDF进行编辑,这一强大功 ...
- 小白也能弄懂的目标检测之YOLO系列 - 第一期
大家好,上期分享了电脑端几个免费无广告且实用的录屏软件,这期想给大家来讲解YOLO这个算法,从零基础学起,并最终学会YOLOV3的Pytorch实现,并学会自己制作数据集进行模型训练,然后用自己训练好 ...
- 5.AVStream和AVCodecParameters
AVStream和AVCodecParameters 说明: AVStream 结构表示当前媒体流的上下文,着重于所有媒体流共有的属性(并且是在程序运行时才能确定其值)和关联其他结构的字段. 其中co ...
- python的运算符及数据类型的转换
python 目录 python 1.算术运算符 2.比较运算符 3.赋值运算符和复合赋值运算符 4.位运算符 5.逻辑运算符 6.成员运算符 7.身份运算符 8.常见的数据类型转换 1.算术运算符 ...
- Docker实战(6): 导出docker镜像离线包
前言 离线环境安装Docker 镜像,我已知两种情况,以下操作我将采用在可访问外网的机器上通过镜像迁移的方式来给离线环境安装. 环境:服务器node1可访问外网.服务器node2无法访问外网 两台机器 ...
- 分布式系统监视zabbix讲解二之邮件报警通知
概述 在上一篇博客<分布式系统监视zabbix讲解一技术流ken>中已经详细讲解了如何安装zabbix,本篇博客将详细讲解如何使用zabbix监控另外一台主机,并实现email报警通知机制 ...