题面自己上网查。

学了一下单纯形。当然 证明什么的 显然是没去学。不然估计就要残废了

上学期已经了解了 什么叫标准型。 听起来高大上 其实没什么

就是加入好多松弛变量+各种*(-1),使得最后成为一般形式:

  给定A[][],求满足A[i][j]*Xj<=A[i][0];(0<i<=n,0<j<=m)

  使A[0][j]*Xj最大的X[];

如果题面中直接得出的条件是A[i][j]*Xj>=A[i][0]; 使 A[0][j]*Xj最小。

  那么就要用对偶定理,变成 A[i][j]*Yi<=A[0][j] 使A[i][0]*Yi最大

    (实际上只要把A转置一下就好了)

  才写了两题单纯形,具体的怎么求Xi之类的 还没学,这里先放代码,之后再补

 #include <bits/stdc++.h>
#define N 1005
#define M 10005
using namespace std;
const double eps=0.00000000001;
const double inf=;
double a[N][M]; int n,m,x,y;
void simplex(){
while (){
int x=,y=; double mn=inf,t;
for (int i=;i<=m;++i) if (a[][i]>eps) {y=i; break;} //找一个可以使答案增加的xi 只要系数为正就可以
if (!y) return; //没有了 说明答案已经不能再增加了
for (int i=;i<=n;++i) if (a[i][y]>eps&&a[i][]/a[i][y]<mn) mn=a[x=i][]/a[i][y]; //对找到的xi ,求出约束最紧的一条约束
if (!x) {a[][]=-inf; return;} //表示 可以无限增加
t=a[x][y]; a[x][y]=;
for (int i=;i<=m;++i) a[x][i]/=t;
for (int i=;i<=n;++i) if (i!=x&&abs(a[i][y])>eps){
t=a[i][y]; a[i][y]=; for (int j=;j<=m;++j) a[i][j]-=t*a[x][j];
}
}
}
int main(){
scanf("%d%d",&n,&m);
for (int i=;i<=n;++i) scanf("%lf",&a[i][]);
for (int i=;i<=m;++i){
scanf("%d%d%lf",&x,&y,&a[][i]);
for (int j=x;j<=y;++j) ++a[j][i];
}
simplex();
printf("%.0lf",round(-a[][]));
return ;
}

好短啊

18年来补。

UOJ的板子题。。应该比较科学了(忽略中间那个assert)

。还有就是 ,单纯形真的不靠谱,,还要random才能过?。。

 #include <bits/stdc++.h>
#define DB long double
using namespace std;
const DB eps=0.000000001;
int n,m,T,k,t,o[],c[];
DB tmp[],a[][];
void SWAP(int k,int t){
swap(o[k],c[t]);
DB x=a[k][t]; a[k][t]=;
for (int j=;j<=n;++j) a[k][j]/=x;
for (int i=;i<=m;++i)
if (i!=k){
x=a[i][t]; a[i][t]=;
for (int j=;j<=n;++j) a[i][j]-=x*a[k][j];
}
}
int main(){
scanf("%d%d%d",&n,&m,&T);
for (int i=;i<=n;++i) scanf("%Lf",&tmp[i]);
for (int i=;i<=n;++i) c[i]=i;
for (int i=;i<=m;++i){
for (int j=;j<=n;++j) scanf("%Lf",&a[i][j]);
scanf("%Lf",&a[i][]); o[i]=i+n;
}
k=-;
for (int i=;i<=m;++i)
if (a[i][]<&&(k==-||a[i][]<a[k][])) k=i;
if (~k){
++n; c[n]=n+m;
for (int i=;i<=m;++i) a[i][n]=-;
SWAP(k,n);
while (){
t=-;
for (int j=n;j;--j)
if (a[][j]>eps) {t=j; if (rand()&) break;}
if (t==-) break;
k=-;
for (int i=;i<=m;++i)
if (a[i][t]>eps)
if (k==-||a[i][]/a[i][t]<a[k][]/a[k][t]) k=i;
SWAP(k,t);
}
if (fabs(a[][])>eps){
puts("Infeasible"); return ;
}
k=t=-;
for (int i=;i<=n;++i) if (c[i]==n+m) t=i;
for (int i=;i<=m;++i) if (o[i]==n+m) k=i;
if (~k){
for (int j=;j<=n;++j)
if (fabs(a[k][j])>eps) {t=j; break;}
if (t==-){
assert(); swap(o[k],o[m]);
for (int j=;j<=n;++j) swap(a[k][j],a[m][j]);
--m;
}else{
SWAP(k,t); swap(c[t],c[n]);
for (int i=;i<=m;++i) swap(a[i][t],a[i][n]);
--n;
}
}else{
swap(c[t],c[n]);
for (int i=;i<=m;++i) swap(a[i][t],a[i][n]);
--n;
}
}
for (int i=;i<=n;++i) a[][i]=;
for (int i=;i<=n;++i)
if (c[i]<=n) a[][i]+=tmp[c[i]];
for (int i=;i<=m;++i)
if (o[i]<=n)
for (int j=;j<=n;++j)
a[][j]-=tmp[o[i]]*a[i][j];
while (){
t=-;
for (int j=n;j;--j)
if (a[][j]>eps) {t=j; if (rand()&) break;}
if (t==-) break;
k=-;
for (int i=;i<=m;++i)
if (a[i][t]>eps)
if (k==-||a[i][]/a[i][t]<a[k][]/a[k][t]) k=i;
if (k==-){
puts("Unbounded");
return ;
}
SWAP(k,t);
}
printf("%.10Lf\n",-a[][]);
if (T){
for (int i=;i<=n;++i) tmp[c[i]]=;
for (int i=;i<=m;++i) tmp[o[i]]=a[i][];
for (int i=;i<=n;++i) printf("%.10Lf ",tmp[i]);
puts("");
}
return ;
}

天壌を翔る者たち

单纯形 BZOJ3112: [Zjoi2013]防守战线的更多相关文章

  1. BZOJ3112 [Zjoi2013]防守战线 【单纯形】

    题目链接 BZOJ3112 题解 同志愿者招募 费用流神题 单纯形裸题 \(BZOJ\)可过 洛谷被卡.. #include<algorithm> #include<iostream ...

  2. bzoj3112 [Zjoi2013]防守战线

    正解:线性规划. 直接套单纯形的板子,因为所约束条件都是>=号,且目标函数为最小值,所以考虑对偶转换,转置一下原矩阵就好了. //It is made by wfj_2048~ #include ...

  3. bzoj3550: [ONTAK2010]Vacation&&bzoj3112: [Zjoi2013]防守战线

    学了下单纯形法解线性规划 看起来好像并不是特别难,第二个code有注释.我还有...*=-....这个不是特别懂 第一个是正常的,第二个是解对偶问题的 #include<cstdio> # ...

  4. 【BZOJ3112】[Zjoi2013]防守战线 单纯形法

    [BZOJ3112][Zjoi2013]防守战线 题解:依旧是转化成对偶问题,然后敲板子就行了~ 建完表后发现跟志愿者招募的表正好是相反的,感觉很神奇~ #include <cstdio> ...

  5. BZOJ 3112 Zjoi2013 防守战线 单纯形

    题目大意: 单纯形*2.. . #include <cmath> #include <cstdio> #include <cstring> #include < ...

  6. ZJOI2013 防守战线

    题目 战线可以看作一个长度为\(n\)的序列,现在需要在这个序列上建塔来防守敌兵,在序列第\(i\)号位置上建一座塔有\(C_i\)的花费,且一个位置可以建任意多的塔,费用累加计算.有\(m\)个区间 ...

  7. BZOJ 3112: [Zjoi2013]防守战线 [单纯形法]

    题目描述 战线可以看作一个长度为n 的序列,现在需要在这个序列上建塔来防守敌兵,在序列第i 号位置上建一座塔有Ci 的花费,且一个位置可以建任意多的塔,费用累加计算.有m 个区间[L1, R1], [ ...

  8. BZOJ 3112 [Zjoi2013]防守战线

    题解:单纯形:转化为对偶问题: 对于最大化 cx,满足约束 Ax<=b ,x>0 对偶问题为 最小化 bx,满足约束 ATx>=c ,x>0 (AT为A的转置) 这一题的内存真 ...

  9. 数学(线性规划): ZJOI2013 防守战线

    偷懒用的线性规划. #include <iostream> #include <cstring> #include <cstdio> using namespace ...

随机推荐

  1. nginx1.6.3

    Nginx1.6.3安装配置 安装时关闭防火墙和selinuxservice iptables stopsed -i "s/selinux=enabled/selinux=disable/g ...

  2. 生物遗传学 整理人PYJ (恋_紫花地丁)

    生物遗传学整理人PYJ (恋_紫花地丁) 高中生物唯一需要数学知识的就是遗传学的概率计算了.这里对简单的遗传学规律做一些总结. 目录: 1.      孟德尔第一定律(分离定律): 2.      孟 ...

  3. 洛谷P1077 摆花

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  4. 2014 蓝桥杯 预赛 c/c++ 本科B组 第九题:地宫取宝(12') [ dp ]

      历届试题 地宫取宝   时间限制:1.0s   内存限制:256.0MB     锦囊1   锦囊2   锦囊3   问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件 ...

  5. Git学习之常见错误 clone被拒绝

    Git学习之常见错误 问题: git clone 时 报错 Permission Denied (权限被拒绝). 解决方法: 需要把本地的公钥上传到服务器. 解决步骤: ①第一步,设置本地的git的用 ...

  6. CodeForces 570D 【dfs序】

    题意: 给一颗树,根节点深度为1,每一个节点都代表一个子母. 数据输入: 节点数 询问数 从编号为2的节点开始依次输入其父节点的编号(共有节点数减1个数字输入) 字符串有节点数个小写字母 接下来询问 ...

  7. jackon - com.fasterxml.jackson.databind.exc.InvalidDefinitionException && UnrecognizedPropertyException: Unrecognized field 异常

    在用jackson解析json数据是碰到的问题 1.首先是InvalidDefinitionException 测试发现可能是目标类中无无参数构造方法导致异常. 添加无参构造方法后发现前一个异常解决但 ...

  8. Java简单实验--关于课后提到的java重载函数的简单分析

    根据这一小段代码,获得了以下的测试截图: 简单分析:根据输出结果,判断这段代码用到了两个不同的函数方法,输出的不止有double类型的数,还有整型的数. 又根据类中的定义情况,square是根据判断传 ...

  9. linux C 中的volatile使用

    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了.精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存 ...

  10. jdk8 stream可以与list,map等数据结构互相转换

    前面我们使用过collect(toList()),在流中生成列表.实际开发过程中,List又是我们经常用到的数据结构,但是有时候我们也希望Stream能够转换生成其他的值,比如Map或者set,甚至希 ...