题解

可能是世界上最裸的一个单纯形

(话说全幺模矩阵是啥我到现在都不知道)

假装我们已经看过了算导,或者xxx的论文,知道了单纯形是怎么实现的

扔一个blog走掉。。https://www.cnblogs.com/ECJTUACM-873284962/p/7097864.html

那么我们根据题意可以列出这样的方程

\(x_i\)表示第\(i\)类志愿者招募的个数

根据题目可列线性规划的式子

以样例为例

\(z = min 2x_1 + 5x_2 + 2x_3\)

\(x_1 + 0 + 0 >= 2\)

\(x_1 + x_2 + 0 >= 3\)

\(0 + x_2 + x_3 >= 4\)

\(x_1,x_2,x_3 >= 0\)

显然,标准型要求我们这些式子是小于号并且z要取max

好吧,反号?

不过我们有个很神奇的原理叫对偶原理

(我是真的不知道为啥……)

也就是

\(min c^T X\)

\(Ax = b\)

等价于

\(max b^T X\)

\(A^TX = c\)

好吧,这是我们喜欢的形式啊

然后我们的方程就可以写成这个样子

\(z = max 2x_1 + 3x_2 + 4x_3\)

\(x_1 + x_2 + 0 <= 2\)

\(0 + x_2 + x_3 <= 5\)

\(0 + 0 + x_3 <= 2\)

我们把这个方程转换成松弛型(也就是全是等于号)

\(x_1 + x_2 + 0 + x_4 = 2\)

\(0 + x_2 + x_3 + x_5 = 5\)

\(0 + 0 + x_3 + x_6 = 2\)

我们3个方程组,6个元,是消不出来的,我们这是一些作为基变量,剩下的非基变量都设成0,那样的话一定是单纯形上的一个顶点

这是一个\(m * (n + m)\)的矩阵,有点大

我们在处理的时候,初始设定所有的\(x_4,x_5,x_6\)作为基变量

每一个方程就是一个关于基变量的等式,我们找到一个替入变量,找到能使替入变量值最大的方程组的等式,将替入变量的位置当做替出变量的位置,矩阵就是\(nm\)的了

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#define enter putchar('\n')
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define eps 1e-7
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {putchar('-');x = -x;}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MAXN = 1005;
const int MAXM = 10005;
int N,M;
db b[MAXM],c[MAXN],a[MAXM][MAXN],ans;
void pivot(int id,int p) {
b[id] /= a[id][p];
for(int j = 1 ; j <= N ; ++j) {
if(j != p) a[id][j] /= a[id][p];
}
a[id][p] = 1 / a[id][p];
for(int i = 1 ; i <= M ; ++i) {
if(i != id) {
if(fabs(a[i][p]) < eps) continue;
for(int j = 1 ; j <= N ; ++j) {
if(j != p) a[i][j] -= a[i][p] * a[id][j];
}
b[i] -= a[i][p] * b[id];a[i][p] = -a[i][p] * a[id][p];
}
}
for(int j = 1 ; j <= N ; ++j) {
if(j != p) c[j] -= c[p] * a[id][j];
}
ans += c[p] * b[id];c[p] = -c[p] * a[id][p];
} void Init() {
read(N);read(M);
for(int i = 1 ; i <= N ; ++i) scanf("%lf",&c[i]);
int s,t;
for(int i = 1 ; i <= M ; ++i) {
scanf("%d %d %lf",&s,&t,&b[i]);
for(int j = s ; j <= t ; ++j) {
a[i][j] = 1.0;
}
}
}
void Solve() {
while(1) {
db t = -1;int p = 0;
for(int i = 1 ; i <= N ; ++i) {
if(c[i] > t) {
t = c[i];p = i;
}
}
if(t <= 0) {printf("%.0lf\n",ans);return;}
t = 0x5fffffff;int id = 0;
for(int j = 1 ;j <= M ; ++j) {
if(a[j][p] > 0 && b[j] / a[j][p] < t) {
t = b[j] / a[j][p];
id = j;
}
}
pivot(id,p);
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}

【BZOJ】1061: [Noi2008]志愿者招募的更多相关文章

  1. BZOJ 1061: [Noi2008]志愿者招募

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4064  Solved: 2476[Submit][Stat ...

  2. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  3. BZOJ 1061: [Noi2008]志愿者招募 费用流

    1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...

  4. BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4813  Solved: 2877[Submit][Stat ...

  5. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记看另一篇吧】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  6. BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)

    题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...

  7. BZOJ 1061: [Noi2008]志愿者招募(线性规划与网络流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 题意: 思路: 直接放上大神的建模过程!!!(https://www.byvoid.com/z ...

  8. 【刷题】BZOJ 1061 [Noi2008]志愿者招募

    Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...

  9. BZOJ 1061 [Noi2008]志愿者招募(费用流)

    题目描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i ...

  10. bzoj 1061 [Noi2008]志愿者招募(数学模型,MCMF)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1061 [题意] 雇人满足每天至少需要的人数. [思路一] Byvoid的题解 clic ...

随机推荐

  1. Java基础-Collection子接口之List接口

    Java基础-Collection子接口之List接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们掌握了Collection接口的使用后,再来看看Collection接口中 ...

  2. 转:SkipList跳表

    http://kenby.iteye.com/blog/1187303 相关概念: 1.几何分布 http://baike.baidu.com/link?url=DdtNq6pCWIvr7onVBtE ...

  3. 2016/1/2 Python中的多线程(1):线程初探

    ---恢复内容开始--- 新年第一篇,继续Python. 先来简单介绍线程和进程. 计算机刚开始发展的时候,程序都是从头到尾独占式地使用所有的内存和硬件资源,每个计算机只能同时跑一个程序.后来引进了一 ...

  4. Git之初始化及提交操作

    Git 的配置文件有三个: Git 把管理的文件分为了两个区域四个状态: 工作区: 当前开发程序所在目录称为工作区,该区域的文件会有状态的变化且状态由 git自动检测,程序中文件做任何操作(增.删.改 ...

  5. [洛谷P3292] [SCOI2016]幸运数字

    洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...

  6. SELECT INTO 和 INSERT INTO SELECT比较

    Insert是T-sql中常用语句,但我们在开发中经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用S ...

  7. CVE-2017-12149JBoss 反序列化漏洞利用

    CVE-2017-12149 漏洞描述 互联网爆出JBOSSApplication Server反序列化命令执行漏洞(CVE-2017-12149),远程攻击者利用漏洞可在未经任何身份验证的服务器主机 ...

  8. JS设计模式——9.组合模式

    组合模式概述 组合模式是一种专为创建Web上的动态用户界面量身定制的模式.使用这种模式可以用一条命令在多个对象上激发复杂的递归的行为. 它可以用来把一批子对象组织成树形结构,并且使整棵树都可被遍历.所 ...

  9. Scrapy项目之User timeout caused connection failure(异常记录)

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 提示:此文存在问题,真正测试, 请勿阅读, 07-14 14:26更新: 经过两个多小时的测试,发现此问题的原因是 ...

  10. ipad webapp禁止长按选择

    1.禁止长按屏幕弹出对话框并选中文字 /*禁止长按选择文字事件*/ * { -webkit-touch-callout: none; -webkit-user-select: none; -khtml ...