bzoj1061--线性规划
线性规划裸题。。。
根据题目很容易可以得到线性规划方程(以样例为例):
Min(2*x1+5*x2+2*x3)
x1+ 0+ 0>=2
x1+x2+ 0>=3
0+x2+x3>=4
x1,x2,x3>=0
再将方程对偶,得到:
Max(2*x1+3*x2+4*x3)
x1+x2+ 0<=2
0+x2+x3<=5
0+ 0+x3<=2
x1,x2,x3>=0
这就是线性规划的标准型了。
为了方便单纯型算法,加入变量x4,x5,x6:
Max(2*x1+3*x2+4*x3)
x4+x1+x2+ 0=2
x5+ 0+x2+x3=5
x6+ 0+ 0+x3=2
x1,x2,x3,x4,x5,x6>=0
这就是松弛型。显然此时最优解不变。
将松弛型写成矩阵的形式:
x1 x2 x3
x4 1 1 0 2
x5 0 1 1 5
x6 0 1 1 2
2 3 4 0(k)
当x1,x2,x3取0时,显然满足条件,此时答案为右下角的常数k
我们只需不断增大k,当k达到最大值时最优解就是k了。
那么怎么增大k呢?显然如果我们增大x1,答案会更优。
但x1不能无限制地增大,对于前3个方程,我们得到x1的限制:
1、x1<=2
2、x1无限制
3、x1无限制
我们选择最紧的一个限制1,将x1增大到它,再交换x1,x4。
交换之后再将某些系数改变,使其满足方程就可以了。
于是我们可以不断交换,直到矩阵最后一行的系数都不为正就可以了。最优解就是k。
具体看代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define N 1001
#define M 10001
#define DB double
#define Eps 1e-7
#define INF 0x3f3f3f3f3f3f3f3f
DB a[M][N],c[N],b[M],Ans,Tmp;
int i,j,n,m,l,r,x;
inline void Pivot(int x,int y){ //转轴操作,使矩阵满足方程
b[x]/=a[x][y];
for(int i=;i<=n;i++)if(i!=y)a[x][i]/=a[x][y];
a[x][y]=/a[x][y];
for(int i=;i<=m;i++)
if(i!=x&&fabs(a[i][y])>Eps){
b[i]-=a[i][y]*b[x];
for(int j=;j<=n;j++)if(j!=y)a[i][j]-=a[i][y]*a[x][j];
a[i][y]*=-a[x][y];
}
Ans+=c[y]*b[x];
for(int i=;i<=n;i++)if(i!=y)c[i]-=c[y]*a[x][i];
c[y]*=-a[x][y];
}
inline DB Simplex(){
while(){ //不断交换
for(i=;i<=n;i++)if(c[i]>Eps)break;
if(i>n)return Ans;
Tmp=INF;
for(j=;j<=m;j++)
if(a[j][i]>Eps&&b[j]/a[j][i]<Tmp)Tmp=b[j]/a[j][i],x=j;
if(Tmp==INF)return INF;
Pivot(x,i); //交换第x行,第i列
}
}
int main()
{
scanf("%d%d",&n,&m);
for(i=;i<=n;i++)scanf("%lf",&c[i]);
for(i=;i<=m;i++){
scanf("%d%d%lf",&l,&r,&b[i]);
for(j=l;j<=r;j++)a[i][j]=;
}
printf("%d",(int)(Simplex()+0.5));
}
bzoj1061
bzoj1061--线性规划的更多相关文章
- 网络流解线性规划问题 BZOJ1061: [Noi2008]志愿者招募
线性规划定义: 在给定有限的资源和竞争约束情况下,很多问题都可以表述为最大化或最小化某个目标.如果可以把目标指定为某些变量的线性函数,而且如果可以将资源约束指定为这些变量的等式或不等式,则得到了一个线 ...
- 单纯形求解线性规划(BZOJ1061)
推荐一篇论文:http://wenku.baidu.com/view/ce5784754a7302768f99391d 我们设xi为第i个志愿者的招募次数,以样例为例,则不难列出如下的线性规划方程: ...
- BZOJ1061 NOI2008 志愿者招募 线性规划、费用流
传送门 一道思路很妙的线性规划网络流 设\(X_i\)表示第\(i\)天需要的人数,\(P_i\)表示第\(i\)种人雇佣的个数 那么我们可以列出一系列式子 比如说样例就可以列出三个式子: \(P_1 ...
- 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)
题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...
- 【bzoj1061】[NOI2008]志愿者招募 线性规划与费用流
题目描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i ...
- BZOJ1061: [Noi2008]志愿者招募(线性规划)
Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 5725 Solved: 3437[Submit][Status][Discuss] Descript ...
- [BZOJ1061][Noi2008]志愿者招募 线性规划+费用流
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1061 根据题意列方程,然后用网络流解线性规划. 题解直接贴ByVoid的吧,太神了:htt ...
- BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模
本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...
- 【bzoj1061】 Noi2008—志愿者招募
http://www.lydsy.com/JudgeOnline/problem.php?id=1061 (题目链接) 题意 给定n天,第i天需要ai个志愿者,有m类志愿者,每类志愿者工作时间为[l, ...
- [BZOJ1061][Noi2008]志愿者招募
[BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...
随机推荐
- JS——实现短信验证码的倒计时功能(没有验证码,只有倒计时)
1.功能描述 当用户想要获取验证码时,就点击 免费获取验证码 ,然后开始倒计时,倒计时期间按钮文字为剩余时间x秒,且不可按状态,倒计时结束后,按钮更改为点击重新发送. 2.分析 必须用到定时器.按钮点 ...
- C程序编译执行过程
C程序编译执行过程 认识C编译执行过程,是C学习的开端. 简单说C语言从编码编译到执行要经历一下过程: C源代码 编译---->形成目标代码,目标代码是在目标机器上运行的代码. 连接-- ...
- 串口通信中ReadFile和WriteFile的超时详解!
源:串口通信中ReadFile和WriteFile的超时详解! 在用ReadFile和WriteFile读写串行口时,需要考虑超时问题.如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFi ...
- SQL truncate 、delete与drop区别
SQL truncate .delete与drop区别 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句 ...
- 产品需求文档写作方法(三)用例文档(UML用例图、流程图)
在产品和技术领域里都有UML的技能知识,而对于产品人员的UML则更多的是指用例图,也就是我所称呼的用户流程图.在讲PRD文档写作的第二篇文章里,我提到了用户流程图的制作,实际上用户流程图是我在产品规则 ...
- Android开发之回调函数
写在前面,最近对回掉函数有了更深刻的认识,现在记录如下.由于在家看不到底层代码,在公司不能访问外网,现在只能凭靠记忆写这篇博文了,写错的地方还希望大神们指出来 其实给组件设置监听就是最典型的回掉函数的 ...
- 《C程序设计语言》读书笔记----习题1-20
练习1-20:编写程序detab,将输入中的制表符替换成适当数目的空格,使得空格充满到下一个制表符终止位的地方,.假设制表符终止位的位置时固定的,比如每隔n列就会出现一个终止位. 这里要理解“制表符” ...
- 一起学JUCE之HashMap
基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同.) ...
- 查找 SqlServer死锁
use master if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') ) dr ...
- IOS开发-UI学习-NSBundle和NSURL的区别(读取文件以及写入文件)
NSBundle和NSURL的区别: 在项目的工程中添加一个文件,本例程添加的是aa.txt,文件的内容为百度: www.baidu.com,现在要使用NSBundle和NSURL分别去获取内容,代码 ...