P3337-[ZJOI2013]防守战线【单纯形】
正题
题目链接:https://www.luogu.com.cn/problem/P3337
题目大意
\(n\)个地方可以建立塔也可以不建立塔,第\(i\)个位置建立需要消耗\(C_i\)元
\(m\)个限制要求在某个区间内的塔的数量超过\(D_i\)
\(1\leq n\leq 1000,1\leq m\leq 10000\)
题目大意
抽象成数学模型的话
\]
\]
然后网络流好像草不过去,考虑点线性规划玄学算法
先把它对偶了
\]
\]
然后就是一个裸的单纯形了。
所以单纯形是什么,这里就粗略的讲一下。
我是看线性规划与单纯形算法-吴一凡的课件学的
对于普通的松弛型有三个限制:
- 对于每个\(i\)满足\(\sum_{j=1}^nA_{i,j}x_j+x_{n+i}=b_i\)
- \(x_{n+i}\geq 0\)
- 最大化\(\sum_{i=1}^nx_ic_i\)
定义所有的\(x_{n+i}\)为基变量,\(x_i(i\leq n)\)为非基变量
然后单纯形的流程就是先找出任意一个\(c_i\)为正的基变量\(x_p\)
然后去掉所有其他非基变量后得到一个对于\(x_p\)最小的限制,即最小的\(\frac{c_p}{a_{p,z}}\)
然后考虑交换非基变量\(x_p\)和基变量\(x_{z+n}\),此时可以得到一个由第\(z\)行的式子推出的关于\(x_p\)的式子,带入回到需要最大化的式子当中。此时由于\(c_i\)为正,所以式子中会有一个正的常数。
此时这个常数就相当于大化了那个式子,不停重复上面的转轴操作直到无法找到正的\(c_i\)为止(此时就代表无法继续扩大了)
这个是实数的,但是我们这题的要求是整数,但是我们这里的约束矩阵\(A\)是一个全幺模矩阵,所以至少保证有一组最优解全是整数,又不用输出方案,直接单纯形暴艹就可以了
复杂度比较玄学,但是能过这题
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1100;
const double eps=1e-8,inf=1e9;
int n,m;double c[N],w[N*10],a[N][N*10],ans;
void Pivot(int l,int e){
c[l]/=a[l][e];
for(int i=1;i<=m;i++)
if(i!=e)a[l][i]/=a[l][e];
a[l][e]=1.0;
for(int i=1;i<=n;i++)
if(i!=l&&fabs(a[i][e])>eps){
c[i]-=a[i][e]*c[l];
for(int j=1;j<=m;j++)
if(j!=e)a[i][j]-=a[i][e]*a[l][j];
a[i][e]=-a[i][e]*a[l][e];
}
ans+=w[e]*c[l];
for(int i=1;i<=m;i++)
if(i!=e)w[i]-=w[e]*a[l][i];
w[e]=-w[e]*a[l][e];
}
double simplex(){
while(1){
double mins=inf;
int i=0,j=0,k=0;
for(j=1;j<=m;j++)
if(w[j]>eps)break;
if(j>m)return ans;
for(i=1;i<=n;i++)
if(a[i][j]>eps&&mins>c[i]/a[i][j])
k=i,mins=c[i]/a[i][j];
if(mins>=inf)return inf;
Pivot(k,j);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lf",&c[i]);
for(int i=1;i<=m;i++){
int l,r;
scanf("%d%d%lf",&l,&r,&w[i]);
for(int j=l;j<=r;j++)a[j][i]=1.0;
}
printf("%d\n",(int)(simplex()+0.5));
return 0;
}
P3337-[ZJOI2013]防守战线【单纯形】的更多相关文章
- BZOJ 3112 Zjoi2013 防守战线 单纯形
题目大意: 单纯形*2.. . #include <cmath> #include <cstdio> #include <cstring> #include < ...
- 【BZOJ3112】[Zjoi2013]防守战线 单纯形法
[BZOJ3112][Zjoi2013]防守战线 题解:依旧是转化成对偶问题,然后敲板子就行了~ 建完表后发现跟志愿者招募的表正好是相反的,感觉很神奇~ #include <cstdio> ...
- BZOJ3112 [Zjoi2013]防守战线 【单纯形】
题目链接 BZOJ3112 题解 同志愿者招募 费用流神题 单纯形裸题 \(BZOJ\)可过 洛谷被卡.. #include<algorithm> #include<iostream ...
- 单纯形 BZOJ3112: [Zjoi2013]防守战线
题面自己上网查. 学了一下单纯形.当然 证明什么的 显然是没去学.不然估计就要残废了 上学期已经了解了 什么叫标准型. 听起来高大上 其实没什么 就是加入好多松弛变量+各种*(-1),使得最后成为一般 ...
- ZJOI2013 防守战线
题目 战线可以看作一个长度为\(n\)的序列,现在需要在这个序列上建塔来防守敌兵,在序列第\(i\)号位置上建一座塔有\(C_i\)的花费,且一个位置可以建任意多的塔,费用累加计算.有\(m\)个区间 ...
- BZOJ 3112: [Zjoi2013]防守战线 [单纯形法]
题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [ ...
- bzoj3112 [Zjoi2013]防守战线
正解:线性规划. 直接套单纯形的板子,因为所约束条件都是>=号,且目标函数为最小值,所以考虑对偶转换,转置一下原矩阵就好了. //It is made by wfj_2048~ #include ...
- BZOJ 3112 [Zjoi2013]防守战线
题解:单纯形:转化为对偶问题: 对于最大化 cx,满足约束 Ax<=b ,x>0 对偶问题为 最小化 bx,满足约束 ATx>=c ,x>0 (AT为A的转置) 这一题的内存真 ...
- 数学(线性规划): ZJOI2013 防守战线
偷懒用的线性规划. #include <iostream> #include <cstring> #include <cstdio> using namespace ...
- bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线
学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> # ...
随机推荐
- jenkins+docker部署java项目
jenkins + maven + jdk + docker + docker register + dockerfile jenkins插件 # 安装插件 SSH # 配置 系统设置-> SS ...
- git上传项目
$ git config --global user.name "xxxxxxxx" --设置名字 $ git config --global user.email "x ...
- VS 添加自定义--代码块 实现一秒创建方法
创建一个方法 你是不是不可避免需要敲以下至少6行代码 现在教你一个方法 实现一秒创建完整方法 首先按照代码块规则创建代码块文件 代码块意义,是什么? 请参考: https://docs.microso ...
- 【spring 注解驱动开发】扩展原理
尚学堂spring 注解驱动开发学习笔记之 - 扩展原理 扩展原理 1.扩展原理-BeanFactoryPostProcessor BeanFactoryPostProcessor * 扩展原理: * ...
- The Programmer's Oath程序员的誓言----鲍勃.马丁大叔(Bob Martin)
In order to defend and preserve the honor of the profession of computer programmers, I Promise that, ...
- 04.SpringMVC之用
分析 Spring MVC 是怎么处理请求的.首先分析 HttpServletBean.FrameworkServlet 和 DispatcherServlet 这三个 Servlet 的处理过程,最 ...
- python下 conda命令手册
0.说明: 对于tensorflow配合keras使用,因为linux服务器没有root权限,所以目前最高可用版本是 1.6.0,否则就会报错某些 so找不到 conda install -n xu ...
- playwright-python 元素定位、frame处理(一)
浏览器.Browser contexts.frame Playwright 可以同时启动多个浏览器(chromium.Firefox.webkit),每个浏览器可以启动多个page(在Playwrig ...
- ES6 class——音乐播放器实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 跨平台APP推荐收藏
时间:2019-04-11 整理:pangYuaner 标题:十大跨平台优秀软件 地址:https://www.cnblogs.com/the-king-of-cnblogs/p/3154758.ht ...