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 ...
随机推荐
- C++ typedef用法小结 (转载)
声明:本文转自charley_yang,点击此处查看原文 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // ...
- stark组件之显示页面内容搭建(六)
之前主要介绍了前端页面list_fiter功能的显示,但是list_display功能的展示并没有过多介绍,这里介绍一下是如何实现的. 可以看到凡是蓝线圈起来的都是通过字段名反射一个个取出来的,红线的 ...
- SQL-Redis使用详细教程
一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1.取最新N个数据的操作 2.排行榜应 ...
- 开启POP3/SMTP服务
实现发送邮件时需要先启用POP3/SMTP服务(以qq邮箱和网易邮箱启用为例) 一 qq邮箱启用 二.网易邮箱开启POP3/SMTP服务 至此:服务已开启
- xtu summer individual 6 B - Number Busters
Number Busters Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForces. ...
- Android二级缓存之物理存储介质上的缓存DiskLruCache
Android二级缓存之物理存储介质上的缓存DiskLruCache Android DiskLruCache属于物理性质的缓存,相较于LruCache缓存,则DiskLruCache属于And ...
- HDU-1163Eddy's digital Roots,九余定理的另一种写法!
下午做了NYOJ-424Eddy's digital Roots后才正式接触了九余定理,不过这题可不是用的九余定理做的.网上的博客千篇一律,所以本篇就不发篇幅过多介绍九余定理了: 但还是要知道什么是九 ...
- Spring Data Jpa系列教程--------实体解析和关联关系
Spring Data Jpa是基于HIbernate开发的,所以建立实体建的实体和映射关系需要好好好的去了解一下,本文有以下内容,实体管理器介绍,实体与数据库表的映射介绍,关联关系(一对多,多对多) ...
- mysql pager用法&命令行命令
下面讲的命令,有部分只能在linux上才有.像pager命令windows上就没有了. 分屏:在Linux上,而且不是xwindow时,使用mysql命令行时,输出太多的东西,看不到就很悲剧了.在sh ...
- poj - 2195 Going Home (费用流 || 最佳匹配)
http://poj.org/problem?id=2195 对km算法不理解,模板用的也不好. 下面是大神的解释. KM算法的要点是在相等子图中寻找完备匹配,其正确性的基石是:任何一个匹配的权值之和 ...