【BZOJ1061/3265】[Noi2008]志愿者招募/志愿者招募加强版 单纯形法
【BZOJ1061】[Noi2008]志愿者招募
Description
Input
Output
仅包含一个整数,表示你所设计的最优方案的总费用。
Sample Input
2 3 4
1 2 2
2 3 5
3 3 2
Sample Output
HINT
1 ≤ N ≤ 1000,1 ≤ M ≤ 10000,题目中其他所涉及的数据均 不超过2^31-1。
题解:先%一发吴大爷http://wenku.baidu.com/view/ce5784754a7302768f99391d
本题给出的条件正好是标准形的,所以可以直接敲板子。不过本题求的是最小值,我们可以转化成对偶问题来求(感觉就是把单纯形表转置了一下~)。
另外在candy的博客上学了全幺模矩阵,感觉十分有用
bz1061:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn=1010;
const int maxm=10010;
const double eps=1e-5;
const double inf=1e12;
double A[maxm][maxn];
int p[maxn];
int n,m;
//0?->C ?0->B 00->ans
void pivot(int l,int e)
{
double t=A[l][e];A[l][e]=1;
int i,j;
for(j=0;j<=n;j++) A[l][j]/=t;
for(p[0]=j=0;j<=n;j++) if(fabs(A[l][j])>eps) p[++p[0]]=j;
for(i=0;i<=m;i++) if(i!=l&&fabs(A[i][e])>eps)
{
t=A[i][e],A[i][e]=0;
for(j=1;j<=p[0];j++) A[i][p[j]]-=t*A[l][p[j]];
}
}
void simplex()
{
while(1)
{
double mn=inf;
int i,j,l=0,e=0;
for(j=1;j<=n;j++) if(A[0][j]>eps)
{
e=j;
break;
}
if(!e) return ;
for(i=1;i<=m;i++) if(A[i][e]>eps&&A[i][0]/A[i][e]<mn) mn=A[i][0]/A[i][e],l=i;
if(!l) return ;
pivot(l,e);
}
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,j,l,r;
for(i=1;i<=n;i++) A[0][i]=rd();
for(i=1;i<=m;i++)
{
l=rd(),r=rd(),A[i][0]=rd();
for(j=l;j<=r;j++) A[i][j]=1;
}
simplex();
printf("%d",int(-A[0][0]+0.5));
return 0;
}
bz3265:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
const double eps=1e-7;
const double inf=1e12;
double A[10010][1010];
int p[1010];
int n,m;
void pivot(int l,int e)
{
double t=A[l][e];A[l][e]=1;
int i,j;
for(j=0;j<=n;j++) A[l][j]/=t;
for(p[0]=j=0;j<=n;j++) if(fabs(A[l][j])>eps) p[++p[0]]=j;
for(i=0;i<=m;i++) if(i!=l&&fabs(A[i][e])>eps)
{
t=A[i][e],A[i][e]=0;
for(j=1;j<=p[0];j++) A[i][p[j]]-=t*A[l][p[j]];
}
}
void simplex()
{
while(1)
{
double mn=inf;
int i,j,l=0,e=0;
for(j=1;j<=n;j++) if(A[0][j]>eps)
{
e=j;
break;
}
if(!e) return ;
for(i=1;i<=m;i++) if(A[i][e]>eps&&A[i][0]/A[i][e]<mn) mn=A[i][0]/A[i][e],l=i;
if(!l) return ;
pivot(l,e);
}
}
int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd();
int i,j,a,l,r;
for(i=1;i<=n;i++) A[0][i]=rd();
for(i=1;i<=m;i++)
{
a=rd();
while(a--)
{
l=rd(),r=rd();
for(j=l;j<=r;j++) A[i][j]=1;
}
A[i][0]=rd();
}
simplex();
printf("%d",int(-A[0][0]+0.5));
return 0;
}
【BZOJ1061/3265】[Noi2008]志愿者招募/志愿者招募加强版 单纯形法的更多相关文章
- bzoj1061: [Noi2008]志愿者招募
线性规划与费用流.http://www.cnblogs.com/iiyiyi/p/5616080.html.数组范围开错了!!!然后2.31-1=0x7fffffff!=0x7f7f7f7f. 开始以 ...
- bzoj1061【NOI2008】志愿者招募
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 2740 Solved: 1703 [Submit][id ...
- BZOJ1061:[NOI2008]志愿者招募——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1061 https://www.luogu.org/problemnew/show/P3980 申奥 ...
- 【bzoj1061】[NOI2008]志愿者招募 线性规划与费用流
题目描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i ...
- 【bzoj1061】 Noi2008—志愿者招募
http://www.lydsy.com/JudgeOnline/problem.php?id=1061 (题目链接) 题意 给定n天,第i天需要ai个志愿者,有m类志愿者,每类志愿者工作时间为[l, ...
- BZOJ 3265: 志愿者招募加强版 [单纯形法]
传送门 一个人多段区间,一样.... 不过国家队论文上说这道题好像不能保证整数解.... #include <iostream> #include <cstdio> #incl ...
- BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)
题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...
- 《小白的CFD之旅》招募写手
<小白的CFD之旅>系列招募写手. 由于工作繁忙,<小白的CFD之旅>系列更新缓慢,现招募志愿者写手.这是一个分享平台,欢迎各位愿意分享自己CFD学习经历的朋友们. <小 ...
- 招募贴:Hadoop专业解决方案招募义务翻译人员
一.招募启事 招募贴:Hadoop专业解决方案招募义务翻译人员,英文原著名称:<Wrox.Professional.Hadoop.Solutions>.愿意参与到此项工作中来的请加群:31 ...
随机推荐
- ECSHOP删除云服务
一.删除[云服务中心]删除/admin/cloud.php删除/admin/templates/menu.htm中以下代码 Ajax.call('cloud.php?is_ajax=1>act= ...
- 2017.3.31 spring mvc教程(三)拦截器
学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...
- Activity返回数据给上一个活动
1.在A这个Activity中以startActivityForResult(intent, requestCode)启动B这个Activity 2.在B这个Activity中setResult(re ...
- foreach 加& 什么意思?
foreach 加&遍历的同时改变原数组即修改数据或者增加数据 foreach 加& 什么意思? 注意:如果我要改变数组某一个值 直接遍历的话原数组是不会变的 下面提供两种方法 1.我 ...
- axios 处理并发请求
//同时发起多个请求时的处理 axios.all([get1(), get2()]) .then(axios.spread(function (res1, res2) { // 只有两个请求都完成才会 ...
- Intent之对象传递(Parcelable传递对象和对象集合)
接着上一篇文章,以下我们讨论一下怎样利用Parcelable实现Intent之间对象的传递 一.实现对象传递 首先创建User.java实现Parcelable接口: package org.yayu ...
- odoo分析会计
odoo财务会计凭证录入时,支持 在凭证行 输入 分析账户和 分析标签 如果凭证行设置了 分析账户或者分析标签, 则在会计凭证过账的时候, 在分析会计功能建立 分析会计分录 其中, 如果设置了分析账户 ...
- swift -NavigationController,代理传值
// // ViewController.swift // NavigationController // import UIKit import Foundation class ViewContr ...
- iOS 原生二维码扫描和生成
代码地址如下:http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描工 ...
- shell脚本通过ping命令来获取平均延时
#!/bin/bash #设置环境变量 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin" exp ...