ZJOI2013 防守战线
题目
战线可以看作一个长度为\(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
,但我还是先写个标准的单纯形吧。
#include <cstdio>
#include <cmath>
#include <iostream>
#include <assert.h>
using namespace std;
const int MAXN = 1003;
const int MAXM = 10003;
const double INF = 1e100;
const double EPS = 1e-8;
int n, m;
double A[MAXN][MAXM];
int main() {
freopen("defend.in", "r", stdin);
freopen("defend.out", "w", stdout);
scanf("%d%d", &n, &m);
n ++, m ++;
for (int i = 1; i < n; i ++) {
scanf("%lf", A[i] + m);
}
for (int i = 1; i < m; i ++) {
int L, R;
scanf("%d%d%lf", &L, &R, A[n] + i);
for (int j = L; j <= R; j ++)
A[j][i] = 1;
}
while (true) {
int x = -1, y;
for (int i = 1; i < m; i ++) {
if (A[n][i] - EPS <= 0) continue;
x = i;
y = -1;
double tval = INF;
for (int j = 1; j < n; j ++) {
if (A[j][i] - EPS <= 0) continue;
double tmp = A[j][m] / A[j][i];
if (tmp < tval) {
tval = tmp;
y = j;
}
}
assert(y != -1);
break;
}
if (x == -1) break;
for (int i = 1; i <= m; i ++)
if (i != x) A[y][i] /= A[y][x];
A[y][x] = (double) 1 / A[y][x];
for (int i = 1; i <= n; i ++)
if (fabs(A[i][x]) > EPS)
for (int j = 1; j <= m; j ++)
if (i != y && j != x)
A[i][j] -= A[i][x] * A[y][j];
for (int i = 1; i <= n; i ++)
if (i != y) A[i][x] *= - A[y][x];
}
printf("%.0lf\n", (double) - A[n][m]);
return 0;
}
ZJOI2013 防守战线的更多相关文章
- 【BZOJ3112】[Zjoi2013]防守战线 单纯形法
[BZOJ3112][Zjoi2013]防守战线 题解:依旧是转化成对偶问题,然后敲板子就行了~ 建完表后发现跟志愿者招募的表正好是相反的,感觉很神奇~ #include <cstdio> ...
- BZOJ 3112: [Zjoi2013]防守战线 [单纯形法]
题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [ ...
- 数学(线性规划): ZJOI2013 防守战线
偷懒用的线性规划. #include <iostream> #include <cstring> #include <cstdio> using namespace ...
- BZOJ 3112 Zjoi2013 防守战线 单纯形
题目大意: 单纯形*2.. . #include <cmath> #include <cstdio> #include <cstring> #include < ...
- bzoj3112 [Zjoi2013]防守战线
正解:线性规划. 直接套单纯形的板子,因为所约束条件都是>=号,且目标函数为最小值,所以考虑对偶转换,转置一下原矩阵就好了. //It is made by wfj_2048~ #include ...
- BZOJ3112 [Zjoi2013]防守战线 【单纯形】
题目链接 BZOJ3112 题解 同志愿者招募 费用流神题 单纯形裸题 \(BZOJ\)可过 洛谷被卡.. #include<algorithm> #include<iostream ...
- 单纯形 BZOJ3112: [Zjoi2013]防守战线
题面自己上网查. 学了一下单纯形.当然 证明什么的 显然是没去学.不然估计就要残废了 上学期已经了解了 什么叫标准型. 听起来高大上 其实没什么 就是加入好多松弛变量+各种*(-1),使得最后成为一般 ...
- bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线
学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> # ...
- BZOJ 3112 [Zjoi2013]防守战线 线性规划
题意: 简单叙述: 一个长度为n的序列,在每一个点建塔的费用为Ci.有m个区间.每一个区间内至少有Dj个塔.求最小花费. 方法:线性规划 解析: 与上一题相似.相同使用对偶原理解题.解法不再赘述. 代 ...
随机推荐
- ThinkPHP第四天(U函数,URL类型参数配置,伪静态后缀名配置,数据传递与获取$_GET等)
1.U('地址','参数','伪静态','是否跳转','是否显示域名'); 在模板中使用U方法而不是固定写死URL地址的好处在于,一旦你的环境变化或者参数设置改变,你不需要更改模板中的任何代码. 在模 ...
- 使用wget -i下载多个文件
使用wget -i下载多个文件 命令: wget -i filelist.txt 说明: 首先,保存一份下载链接文件 cat > filelist.txt url1 url2 url3 url4
- 我的Python成长之路---第六天---Python基础(18)---2016年2月20日(晴)
os模块 提供对操作系统进行调用的接口 >>> import os >>> os.getcwd() # 获取当前工作目录,类似linux的pwd命令 '/data/ ...
- USB接口定义
一般的排列方式是:红白绿黑从左到右 定义: 红色-USB电源 标有-VCC.Power.5V.5VSB字样 绿色-USB数据线(正)-DATA+.USBD+.PD+.USBDT+ 白色-USB数据线( ...
- C++惯用法:通过成员模板实现隐式转换(Coercion 强迫 by Member Template)
Intent To increase the flexibility of a class template's interface by allowing the class template to ...
- zkw费用流模版
/************************************************************** Problem: 3876 User: wangck1998 Langu ...
- ckeditor3.4.2是否升级为4.2.1的问题
ckeditor官网访问地址: http://ckeditor.com/demo 目前公司项目中用到富文本编辑器基本都是cheditor3.4.2, 在不修改其源码的情况下,不兼容于IE10,具体见& ...
- hadoop源代码解读namenode高可靠:HA;web方式查看namenode下信息;dfs/data决定datanode存储位置
点击browserFilesystem,和命令查看结果一样 当我们查看hadoop源代码时,我们看到hdfs下的hdfs-default.xml文件信息 我们查找${hadoop.tmp.dir}这是 ...
- Windows 下统计行数的命令
大家都知道在Linux下统计文本行数能够用wc -l 命令.比如: -bash-3.2$ cat pif_install.log | wc -l 712 但在Windows下怎样统计输出文 ...
- Latex(一)公式自动编号与自动引用
在进行latex引用时,有两种办法: 一,被动引用. 如有这样一段代码: $$ x^2+y^2= z^2.\eqno(1.1) $$ In this paper, we investigated (1 ...