题目

战线可以看作一个长度为\(n\)的序列,现在需要在这个序列上建塔来防守敌兵,在序列第\(i\)号位置上建一座塔有\(C_i\)的花费,且一个位置可以建任意多的塔,费用累加计算。有\(m\)个区间\([L_1,R_1],[L_2,R_2],…,[L_m,R_m]\),在第\(i\)个区间的范围内要建至少\(D_i\)座塔。求最少花费。

算法1——费用流

我们会发现这题很像Noi2008 志愿者招募

但是两式相减之后却不能产生想[志愿者招募]一样的效果,原因是对于一个区间,它体现在矩阵里面的系数不是在同一列,而是在同一行。

有个神奇的东西,就是转换成这个问题的对偶问题。对偶问题怎么转换呢,链接

对于原问题 可以描述为:

有一个工厂,它生产\(n\)种产品,第\(i\)种产品可以卖\(c_i\)元

现在一共有\(m\)种材料 生产一个产品\(i\)需要\(a_{ij}\)个材料\(j\)

每个材料的个数有上限 为\(b_i\)

现在要求一种生产方案使得获利最多

这个问题的对偶问题 可以描述为:

你现在要找这个工厂购买原材料 第\(i\)种材料需要\(b_i\)个 价格由你定

这个工厂会把材料卖给你 仅当它觉得不亏

即它把卖给你的材料拿去做产品的价值\(\leq\)你收购做这个产品所需材料的价格和

求最少需要多少钱可以收购完

我觉得这个“证明”好形象!

然后我们就可以像[志愿者招募]一样构图,接着用跑费用流了,但是最“原始”的费用流会被卡掉\(3\)个点,所以我们要用\(zkw\)网络流!

一开始我有点担心图中会不会出现正圈,lzh教导我:如果原图没有正圈,那么残余网络中也不会有正圈!

算法2——单纯形

这个单纯形,我弄了一整个早上才明白。

这里是维基的资料

关于单纯形,什么时候我们能跑整数的呢(在这题里面,矩阵里的元素只有\(-1,0,1\))?想到省赛就要来了,先把这个问题放一放。贴吧里有个帖子就是讨论这个的。

贴个代码,虽然不需要用double,但我还是先写个标准的单纯形吧。

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <assert.h>
  5. using namespace std;
  6. const int MAXN = 1003;
  7. const int MAXM = 10003;
  8. const double INF = 1e100;
  9. const double EPS = 1e-8;
  10. int n, m;
  11. double A[MAXN][MAXM];
  12. int main() {
  13. freopen("defend.in", "r", stdin);
  14. freopen("defend.out", "w", stdout);
  15. scanf("%d%d", &n, &m);
  16. n ++, m ++;
  17. for (int i = 1; i < n; i ++) {
  18. scanf("%lf", A[i] + m);
  19. }
  20. for (int i = 1; i < m; i ++) {
  21. int L, R;
  22. scanf("%d%d%lf", &L, &R, A[n] + i);
  23. for (int j = L; j <= R; j ++)
  24. A[j][i] = 1;
  25. }
  26. while (true) {
  27. int x = -1, y;
  28. for (int i = 1; i < m; i ++) {
  29. if (A[n][i] - EPS <= 0) continue;
  30. x = i;
  31. y = -1;
  32. double tval = INF;
  33. for (int j = 1; j < n; j ++) {
  34. if (A[j][i] - EPS <= 0) continue;
  35. double tmp = A[j][m] / A[j][i];
  36. if (tmp < tval) {
  37. tval = tmp;
  38. y = j;
  39. }
  40. }
  41. assert(y != -1);
  42. break;
  43. }
  44. if (x == -1) break;
  45. for (int i = 1; i <= m; i ++)
  46. if (i != x) A[y][i] /= A[y][x];
  47. A[y][x] = (double) 1 / A[y][x];
  48. for (int i = 1; i <= n; i ++)
  49. if (fabs(A[i][x]) > EPS)
  50. for (int j = 1; j <= m; j ++)
  51. if (i != y && j != x)
  52. A[i][j] -= A[i][x] * A[y][j];
  53. for (int i = 1; i <= n; i ++)
  54. if (i != y) A[i][x] *= - A[y][x];
  55. }
  56. printf("%.0lf\n", (double) - A[n][m]);
  57. return 0;
  58. }

ZJOI2013 防守战线的更多相关文章

  1. 【BZOJ3112】[Zjoi2013]防守战线 单纯形法

    [BZOJ3112][Zjoi2013]防守战线 题解:依旧是转化成对偶问题,然后敲板子就行了~ 建完表后发现跟志愿者招募的表正好是相反的,感觉很神奇~ #include <cstdio> ...

  2. BZOJ 3112: [Zjoi2013]防守战线 [单纯形法]

    题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [ ...

  3. 数学(线性规划): ZJOI2013 防守战线

    偷懒用的线性规划. #include <iostream> #include <cstring> #include <cstdio> using namespace ...

  4. BZOJ 3112 Zjoi2013 防守战线 单纯形

    题目大意: 单纯形*2.. . #include <cmath> #include <cstdio> #include <cstring> #include < ...

  5. bzoj3112 [Zjoi2013]防守战线

    正解:线性规划. 直接套单纯形的板子,因为所约束条件都是>=号,且目标函数为最小值,所以考虑对偶转换,转置一下原矩阵就好了. //It is made by wfj_2048~ #include ...

  6. BZOJ3112 [Zjoi2013]防守战线 【单纯形】

    题目链接 BZOJ3112 题解 同志愿者招募 费用流神题 单纯形裸题 \(BZOJ\)可过 洛谷被卡.. #include<algorithm> #include<iostream ...

  7. 单纯形 BZOJ3112: [Zjoi2013]防守战线

    题面自己上网查. 学了一下单纯形.当然 证明什么的 显然是没去学.不然估计就要残废了 上学期已经了解了 什么叫标准型. 听起来高大上 其实没什么 就是加入好多松弛变量+各种*(-1),使得最后成为一般 ...

  8. bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线

    学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> # ...

  9. BZOJ 3112 [Zjoi2013]防守战线 线性规划

    题意: 简单叙述: 一个长度为n的序列,在每一个点建塔的费用为Ci.有m个区间.每一个区间内至少有Dj个塔.求最小花费. 方法:线性规划 解析: 与上一题相似.相同使用对偶原理解题.解法不再赘述. 代 ...

随机推荐

  1. [条款36]绝不重新定义继承而来的non-virtual函数

    看下面的两个类的声明代码: class B { public: void mf(); //something to do }; class D : public B { public: void mf ...

  2. C#学习日记之数据库连接

    一.webconfig设置和参数解释 在C#中新建一个网站时,webconfig文件中会有一个默认的数据库连接语句,如下 <connectionStrings> <add name= ...

  3. java和C#之间SOCKET通信的问题

    转自:http://www.cdtarena.com/javapx/201307/9170.html java和C#之间SOCKET通信的问题 一.服务器端(使用java编写) /** * 监听客户端 ...

  4. Cygwin ssh

    http://www.evalumation.com/blog/86-cygwin-windows7-sshd

  5. Sphnix

    Sphinx高性能的搜索引擎(简单.强大.实用) http://blog.csdn.net/lgm252008/article/details/5373354

  6. QT VS检测内存泄漏

    测试程序:http://download.csdn.net/detail/ajaxhe/4085447 vld-2.2.3: http://vld.codeplex.com/releases/view ...

  7. Qt mac QMYSQL(动态加载插件QPluginLoader的用法)

    用此段代码查出问题所在 QPluginLoader loader; loader.setFileName("/Users/danny/Qt5.3.2/5.3/clang_64/plugins ...

  8. 有n个数(两两不同),对于这n个数的每个连续子序列,把其中最大的一个数标记一次,问最后每个数被标记次数

    今天在qq群了看到了这个题目,觉得用单调栈的解法挺好,可以在o(n)内搞定,特意记录下来 首先明确单调栈的含义: 栈是FILO的,栈的所有操作都是在栈顶进行. 单调性指的是当前栈中存储的元素是严格的递 ...

  9. Uva 11694 Gokigen Naname

    基本思路是Dfs: 1. 一个一个格子摆放,以每个各自的左上角的点为基准点代表格子,比如(0,0)代表(0,0)(0,1)(1,0)(1,1)组成的格子,(0,1)代表(0,1)(0,2)(1,1), ...

  10. linux下的压缩解压命令 tar 的简单描述

    命令名称:tar 命令所在路径:/bin/tar 语法:tar选项·「-zcf」·「压缩后文件名」「目录」 -c 打包 -v 显示详细信息 -f 指定文件名 -z 打包同时压缩 tar命令解压缩语法: ...