bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线
学了下单纯形法解线性规划
看起来好像并不是特别难,第二个code有注释。我还有...*=-....这个不是特别懂
第一个是正常的,第二个是解对偶问题的
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-; int n,m; double sum;
double a[][],b[],c[];
void pivot(int o,int e)
{
b[o]/=a[o][e];
for(int i=;i<=n;i++)
if(i!=e)a[o][i]/=a[o][e];
a[o][e]=/a[o][e]; for(int i=;i<=m;i++)
if(i!=o&&fabs(a[i][e])>eps)
{
b[i]-=b[o]*a[i][e];
for(int j=;j<=n;j++)
if(j!=e)a[i][j]-=a[o][j]*a[i][e];
a[i][e]*=-a[o][e];
} sum+=c[e]*b[o];
for(int i=;i<=n;i++)
if(i!=e)c[i]-=a[o][i]*c[e];
c[e]*=-a[o][e];
}
void simplex()
{
int e,o; double d;
while()
{
d=;
for(int i=;i<=n;i++)
if(c[i]>d)d=c[i],e=i;
if(d==)return ; d=(<<);
for(int i=;i<=m;i++)
if(a[i][e]>eps&&d>b[i]/a[i][e])
d=b[i]/a[i][e],o=i;
if(d==(<<)){sum=(<<);return ;} pivot(o,e);
}
}
int main()
{
int K;
scanf("%d%d",&n,&K);m=*n+;n*=;
for(int i=;i<=n;i++)scanf("%lf",&c[i]);
for(int i=;i<=m;i++)
{
b[i]=K;
for(int j=;j<=n/;j++)a[i][i+j-]++;
}
for(int i=;i<=n;i++)
b[m+i]=,a[m+i][i]++;
m+=n;
sum=;simplex();
printf("%.0lf\n",sum);
return ;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-; int n,m; double sum;
double a[][],b[],c[];
//解的过程中,由于基变量xi=ci,所以c也代表放在当前约束的基变量取值 void pivot(int o,int e)//把作为第o个约束的基变量用e替换
{
c[o]/=a[o][e];//没有替换之前,e的取值被当前限制,是c[o]/a[i][e],先令x=c
for(int i=;i<=m;i++)//把e的系数消掉,其实常数项c也是同理的
if(i!=e)a[o][i]/=a[o][e];
a[o][e]=/a[o][e];//难点!取倒数相当于保留了自己的常数项,而除以了上一个的常数项,这样下面就可以直接消除上一个的影响了 for(int i=;i<=n;i++)
if(i!=o&&fabs(a[i][e])>eps)//对于其它的约束条件,把离基的变量用进基的变量替代
{
c[i]-=c[o]*a[i][e];
for(int j=;j<=m;j++)
if(j!=e)a[i][j]-=a[o][j]*a[i][e];
a[i][e]*=-a[o][e];
} sum+=b[e]*c[o];//系数乘以值
for(int i=;i<=m;i++)//对于第i个变量当前已经用了b[e]*a[o][i]来贡献答案了
if(i!=e)b[i]-=a[o][i]*b[e];
b[e]*=-a[o][e];
}
void simplex()
{
int e,o; double d;
while()
{
d=;//找进基的变量
for(int i=;i<=m;i++)//基变量的b一定<=0,在非基变量中找一个对答案贡献最大(系数最大)的进基
if(b[i]>d)d=b[i],e=i;
if(d==)return ; d=(<<);//找离基的变量,进基变量系数的非负比要最小
for(int i=;i<=n;i++)//找对e的最小约束(即用此新角点截距最小,也就是当前e的取值被这个约束条件约束)离基
if(a[i][e]>eps&&d>c[i]/a[i][e])
d=c[i]/a[i][e],o=i;
if(d==(<<)){sum=(<<);return ;} pivot(o,e);
}
} int main()
{
int l,r;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%lf",&c[i]);
memset(a,,sizeof(a));
for(int i=;i<=m;i++)
{
scanf("%d%d%lf",&l,&r,&b[i]);
for(int j=l;j<=r;j++)a[j][i]++;
}
simplex();
printf("%.0lf\n",sum); return ;
}
---恢复内容结束---
bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线的更多相关文章
- BZOJ3112 [Zjoi2013]防守战线 【单纯形】
题目链接 BZOJ3112 题解 同志愿者招募 费用流神题 单纯形裸题 \(BZOJ\)可过 洛谷被卡.. #include<algorithm> #include<iostream ...
- bzoj3112 [Zjoi2013]防守战线
正解:线性规划. 直接套单纯形的板子,因为所约束条件都是>=号,且目标函数为最小值,所以考虑对偶转换,转置一下原矩阵就好了. //It is made by wfj_2048~ #include ...
- 单纯形 BZOJ3112: [Zjoi2013]防守战线
题面自己上网查. 学了一下单纯形.当然 证明什么的 显然是没去学.不然估计就要残废了 上学期已经了解了 什么叫标准型. 听起来高大上 其实没什么 就是加入好多松弛变量+各种*(-1),使得最后成为一般 ...
- 【BZOJ3112】[Zjoi2013]防守战线 单纯形法
[BZOJ3112][Zjoi2013]防守战线 题解:依旧是转化成对偶问题,然后敲板子就行了~ 建完表后发现跟志愿者招募的表正好是相反的,感觉很神奇~ #include <cstdio> ...
- BZOJ3550: [ONTAK2010]Vacation
3550: [ONTAK2010]Vacation Time Limit: 10 Sec Memory Limit: 96 MBSubmit: 91 Solved: 71[Submit][Stat ...
- BZOJ 3112: [Zjoi2013]防守战线 [单纯形法]
题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [ ...
- ZJOI2013 防守战线
题目 战线可以看作一个长度为\(n\)的序列,现在需要在这个序列上建塔来防守敌兵,在序列第\(i\)号位置上建一座塔有\(C_i\)的花费,且一个位置可以建任意多的塔,费用累加计算.有\(m\)个区间 ...
- BZOJ3550 [ONTAK2010]Vacation 【单纯形】
题目链接 BZOJ3550 题解 单纯形裸题 题意不清,每个位置最多选一次 #include<algorithm> #include<iostream> #include< ...
- 数学(线性规划): ZJOI2013 防守战线
偷懒用的线性规划. #include <iostream> #include <cstring> #include <cstdio> using namespace ...
随机推荐
- 导出网页表格数据为Excel文件的前端解决方案
在工作中,我们有时会遇到这样的需求,比如:要把页面的表格数据导出为Excel文件.在此记录下自己用的解决方法.代码如下: function tableToExcel(data){ //要导出的数据,t ...
- 简单的linux看门狗脚本
watchdog.sh #!/bin/bash now=`date '+%Y-%m-%d %H:%M:%S'` baseDir=$(cd `dirname $0`; pwd) sleepTime=10 ...
- thinkphp 5.0整合阿里大于验证码短信发送接口,含完整模型验证实例DEMO
为大家分享一个阿里大于短信发送接口: 首先创建一个发送模型(Send.php): <?php namespace app\index\model; use think\Validate; cla ...
- CentOS 7.4 源码编译安装 Redis
一.CentOS 7.4 源码编译安装 Redis 1.下载源码并解压 wget http://download.redis.io/releases/redis-4.0.10.tar.gz tar ...
- assert.deepEqual()
assert.deepEqual(actual, expected[, message]) 深度比较 actual 和 expected 参数,使用比较运算符(==)比较原始值. 只考虑可枚举的&qu ...
- Can't connect to MySQL server on '127.0.0.1' (10061) (code 2003)解决方法
- 80-Force Index,强力指标.(2015.7.1)
Force Index 强力指标 Index,强力指标.(2015.7.1)" title="80-Force Index,强力指标.(2015.7.1)"> 观井 ...
- 集训第四周(高效算法设计)P题 (构造题)
Description There are N<tex2html_verbatim_mark> marbles, which are labeled 1, 2,..., N<te ...
- Springboot 缓存使用
. CachingProvider . CacheManager . Cache . Entry . Expiry 1. 开启基于注解的缓存 @EnableCaching 下面列出几个核心的注解 @C ...
- Linux下C编程入门(1)
Linux系统的介绍(以下以Manjaro最新版为例子): 一.系统的安装: 1.可以直接使用U盘做一个live usb的启动盘,在bios中设置从U盘启动即可拥有linux系统,如果是新式bios需 ...