本想在洛谷上交篇题解的,结果发现交不了,所以只能在这边写了。。。


作为一个蒟蒻,看到省选题,第一眼考虑怎么打暴力

我们可以分情况考虑

  1. 当\(s==1\)的时候

我们可以把他当成一个\(01\)背包,背包总体积为m,每个城堡为每一件物品,他的价值为 \(i\) 及他的编号,他的体积为 \(2*\) 派兵的人数加一(保证严格大于其他玩家派兵的人数)。这样跑一遍\(01\)背包不就完事了吗 QAQ。。。。

这样你就会拿到 40-50pts。但作为蒟蒻的我,已经很满足了。。。

2.其他情况,不会写QAQ。。。


附上 40-50pts 代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. int n,m,s,v;
  6. int f[20010],c[110][110],w[110][110];
  7. void slove2()
  8. {
  9. for(int i = 1; i <=s; i++)//枚举人数
  10. {
  11. for(int j = 1; j <= n; j++)//枚举城堡数
  12. {
  13. scanf("%d",&v);
  14. c[j][i] = 2*v+1;
  15. w[j][i] = j;
  16. }
  17. }
  18. for(int i = 1; i <= n; i++)//01背包
  19. {
  20. for(int j = m; j >= 0; j--)
  21. {
  22. f[j] = f[j-c[i][k]] + w[i][k];
  23. }
  24. }
  25. if(s == 1) printf("%d\n",f[m]);
  26. }
  27. int main()
  28. {
  29. scanf("%d%d%d",&s,&n,&m);
  30. slove2();
  31. return 0;
  32. }

但在经过神犇指导后,我思考出这样一个优化。

当我们往一个城堡派兵数量为 \(v\)时,那么小于\(v\)的其他人都会被打败,也就是出兵比我们少的,都会的打败。假设出兵比我们少的人为 \(p\) 那么你就可以获得 \(i\) * \(p\) 的分数。\(i\)为城堡编号。

我们可以通过排序加快这一过程,这样我们得到了每件物品的价值和体积。

但这时不再是个\(01\)背包,而是个分组背包。我们可以把每个城堡当做一组,

每个城堡,你可以放s种选择,来打败玩家,但每种选择只能选一种。

这不就是个妥妥的分组背包了吗???

综上,这个题的大体思路就是,通过派兵人数从大到小排序处理出每件物品的价值和体积。 物品的体积就是\(2*\)派兵人数+\(1\) 价值就是 \(i*\) 比他小的数的个数(因为排序保证前边的出兵人数都是比他小的)。最后跑一遍分组背包,就可以轻松AC了这道题。

附上AC代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. int n,m,s,v;
  6. int f[20010],c[110][110],w[110][110];
  7. int main()
  8. {
  9. scanf("%d%d%d",&s,&n,&m);
  10. for(int i = 1; i <=s; i++)
  11. {
  12. for(int j = 1; j <= n; j++)
  13. {
  14. scanf("%d",&c[j][i]);
  15. }
  16. }
  17. for(int i = 1; i <= n; i++)
  18. {
  19. sort(c[i]+1,c[i]+s+1);//按出兵人数排序
  20. for(int j = 1; j <= s; j++)
  21. {
  22. c[i][j] = c[i][j] * 2 + 1;
  23. w[i][j] = i * j;//他的价值为在这个城堡比他派兵少的人数*这个城堡的编号
  24. }
  25. }
  26. for(int i = 1; i <= n; i++)//分组背包的模板
  27. {
  28. for(int j = m; j >= 0; j--)
  29. {
  30. for(int k = 1; k <= s; k++)
  31. {
  32. if(j - c[i][k] >= 0)
  33. {
  34. f[j] = max(f[j],f[j-c[i][k]] + w[i][k]);
  35. }
  36. }
  37. }
  38. }
  39. printf("%d\n",f[m]);
  40. return 0;
  41. }

本人码风过丑,请各位大佬不要喷QAQ。。。

由于作者是个菜鸡,可能无法解释清楚这道题,请见谅。。。。。

P5322 排兵布阵解题报告的更多相关文章

  1. ACM: 敌兵布阵 解题报告 -线段树

    敌兵布阵 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Li ...

  2. hdu 1166 敌兵布阵 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目意思:给出 N 个数你,通过对某些数进行更改(或者 + 或者 -),当输入的是 Query ...

  3. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 //#pragma co ...

  4. HDU 4539 郑厂长系列故事——排兵布阵

    http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others) ...

  5. 郑厂长系列故事——排兵布阵 hdu4539(状态压缩DP)

    郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  6. [BJOI2019]排兵布阵——分组背包

    题目链接: [BJOI2019]排兵布阵 对于每座堡垒,将$s$个对手排序,显然如果安排的兵力能打败第$i$个对手就一定能打败前$i-1$个. 那么对于第$i$座城堡,可以看做有$s+1$个物品(可以 ...

  7. [BJOI2019]排兵布阵(动态规划)

    [BJOI2019]排兵布阵(动态规划) 题面 洛谷 题解 暴力dp: 设\(f[i][j]\)表示考虑到了第\(i\)座城市用了\(j\)人的最大收益,枚举在这个城市用多少人就可以了. 优化: 发现 ...

  8. HDU-4539郑厂长系列故事——排兵布阵(状态压缩,动态规划)

    郑厂长系列故事--排兵布阵 Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total ...

  9. HDU 4539 郑厂长系列故事——排兵布阵 状压dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/O ...

随机推荐

  1. P4609 建筑师

    题目描述 小 Z 是一个很有名的建筑师,有一天他接到了一个很奇怪的任务:在数轴上建 n 个建筑,每个建筑的高度是 1 到 n 之间的一个整数. 小 Z 有很严重的强迫症,他不喜欢有两个建筑的高度相同. ...

  2. JetBrain破解

    https://blog.csdn.net/u014044812/article/details/78727496 https://jetlicense.nss.im/ https://zhile.i ...

  3. [BUUOJ记录] [GXYCTF2019]BabyUpload

    CTF三大骗局:Baby Easy Funny,本题主要考察.htaccess文件解析文件.文件类型检测绕过 打开题目给了一个上传点,上传一个php文件看看过滤规则 “后缀名不能有ph”直接禁掉了所有 ...

  4. 最小生成树MST

    定义 在一给定的无向联通带权图\(G = (V, E, W)\)中,\((u, v)\) 代表连接顶点 \(u\) 与顶点 \(v\) 的边,而 \(w(u, v)\) 代表此边的权重,若存在 \(T ...

  5. 编程体系结构(02):Java异常体系

    本文源码:GitHub·点这里 || GitEE·点这里 一.异常简介 优秀的程序代码,都在追求高效,安全,和低错误率,但是程序中的异常是无法避免的,降低异常出现的频率是关键,异常出现如何处理是另一个 ...

  6. Angular(二) - 组件Component

    1. 组件Component示例 2. Component常用的几个选项 3. Component全部的选项 3.1 继承自@Directive装饰器的选项 3.2 @Component自己特有的选项 ...

  7. 单线程模式从网易下载A股叁仟捌佰支股票一年的交易数据耗时十四分钟

    代码下载:https://files.cnblogs.com/files/xiandedanteng/StockDataDownloader20200305.rar 压缩包内包含股票代号文件,调整好日 ...

  8. iTextSharp生成PDF文件

    这是一篇简单的教程,所以只涉及一些iTextSharp生成pdf的简单应用,详细教程请搜索iTextSharp进入官网看官方文档(英文版). iTextSharp官方文档:https://itextp ...

  9. leetcode刷题-53最大子序和

    题目 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 思路 动态规划:求整个数组的连续子数组的最大和,可以求出每个位置的连续子数组的最大和,返回 ...

  10. c++基础 写二进制文件

    问题描述 有许多数据待拟合,需要从 root 中提取出来,写成文本文件数据量过大,想转成二进制文件. 解决 #include "TString.h" #include " ...