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 ...
随机推荐
- javascript事件委托和jquery事件委托
元旦过后,新年第一篇. 初衷:很多的面试都会涉及到事件委托,前前后后也看过好多博文,写的都很不错,写的各有千秋,自己思前想后,为了以后自己的查看,也同时为现在找工作的前端小伙伴提供一个看似更全方位的解 ...
- mysql出现问题汇总(持续更新)
1.mysql -uqwe -p普通用户登陆时提示: ERROR 1045 (28000): Access denied for user 'baijie'@'%' (using password: ...
- sysbench--mysql测试
1.下载sysbench-0.4.12.14.tar.gz 2.解压.tar -zxf sysbench-0.4.12.14.tar.gz 3.编译: 填写mysql路劲. ./configure - ...
- 基于Redis的三种分布式爬虫策略
前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够“ ...
- php7 安装swoole扩展
昨天无意中看到一篇关于直播的视频教程 里面讲到了swoole,对于这个东西我相信大家(接近1年phper)都是听过它,但没有真正去用它,当然也是不知道如何使用(me too). 此处总结一下(借鉴了几 ...
- String类的概述和构造方法
StringDemo.java /* * String:字符串类 * 由多个字符组成的一串数据 * 字符串其本质就是一个字符数组 * * 构造方法: * String(String original) ...
- 缩小Oracle目录下UNDOTBS01.DBF文件的大小
缩小Oracle目录下UNDOTBS01.DBF文件的大小 分类: Oracle 使用sys用户登录Oracle 方法一:重置表空间大小 执行ALTER DATABASE DATAFILE 'D:OR ...
- 【Codeforces 1042D】Petya and Array
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 把a[i]处理成前缀和 离散化. 枚举i从1..n假设a[i]是区间和的a[r] 显然我们需要找到a[r]-a[l]<t的l的个数 即a ...
- 搜索 比MySQL快10倍?这可能是目前AWS Aurora最详解读!
作者介绍 朱阅岸,中国人民大学博士,现供职于腾讯云数据库团队.研究方向主要为数据库系统理论与实现.新硬件平台下的数据库系统以及TP+AP型混合系统. 编者按 Aurora作为AWS云上的关系数据库 ...
- [bzoj1188][HNOI2007]分裂游戏_博弈论
分裂游戏 bzoj-1188 HNOI-2007 题目大意:题目链接. 注释:略. 想法: 我们发现如果一个瓶子内的小球个数是奇数才是有效的. 所以我们就可以将问题变成了一个瓶子里最多只有一个球球. ...