软件开发

Time Limit: 10 Sec  Memory Limit: 162 MB
[Submit][Status][Discuss]

Description

  某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消毒毛巾,这种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种,A种方式的消毒需要a天时间,B种方式的消毒需要b天(b>a),A种消毒方式的费用为每块毛巾fA,

B种消毒方式的费用为每块毛巾fB,而买一块新毛巾的费用为f(新毛巾是已消毒的,当天可以使用);而且f>fA>fB。公司经理正在规划在这n天中,每天买多少块新毛巾、每天送多少块毛巾进行A种消毒和每天送多少块毛巾进行B种消毒。当然,公司经理希望费用最低。你的任务就是:为该软件公司计划每天买多少块毛巾、每天多少块毛巾进行A种消毒和多少毛巾进行B种消毒,使公司在这项n天的软件开发中,提供毛巾服务的总费用最低。

Input

  第1行为n,a,b,f,fA,fB. 第2行为n1,n2,……,nn.

Output

  最少费用

Sample Input

  4 1 2 3 2 1
  8 2 1 6

Sample Output

  38

HINT

  1≤f,fA,fB≤60,1≤n≤1000

Main idea

  每天要用Ni块餐巾,有如下几种选择:
    1.买新的,每块f元;
    2.用A方式处理,a天后得到餐巾,每块花费fA元;
    3.用B方式处理,b天后得到餐巾,每块花费fB元。
  问满足要求的最小花费。

Solution

  显然是费用流,拆成两个点,Xi表示用完的,Yi表示需要的,那么建模显然:(令x表示这天需要多少餐巾)
    S->Xi 流量为x,费用为0, mean:这天需要这么多
    Yi->T 流量为x,费用为0, mean:这天需要这么多
    S->Yi 流量为INF,费用为f, mean:全部买新的
    Xi->Xi+1 流量为INF,费用为0, mean:把这天用完的餐巾放到下一天处理
    Xi->Yi+a+1 流量为INF,费用为fA, mean:用A方式处理
    Xi->Yi+b+1 流量为INF,费用为fB, mean:用B方式处理

Code

 #include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long s64; const int ONE = ;
const int EDG = ;
const int INF = ; int n,a,b,f,fA,fB;
int x;
int X[ONE],Y[ONE];
int S,T;
int next[EDG],first[ONE],go[EDG],from[EDG],pas[EDG],w[EDG],tot;
int dist[ONE],pre[ONE],vis[ONE];
int tou,wei,q[ONE];
int Ans; inline int get()
{
int res=,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} void Add(int u,int v,int flow,int z)
{
next[++tot]=first[u]; first[u]=tot; go[tot]=v; from[tot]=u; pas[tot]=flow; w[tot]=z;
next[++tot]=first[v]; first[v]=tot; go[tot]=u; from[tot]=v; pas[tot]=; w[tot]=-z;
} bool Bfs()
{
for(int i=S;i<=T;i++) dist[i] = INF;
dist[S] = ; vis[S] = ;
tou = ; wei = ; q[] = S;
while(tou < wei)
{
int u = q[++tou];
for(int e=first[u]; e; e=next[e])
{
int v = go[e];
if(dist[v] > dist[u] + w[e] && pas[e])
{
dist[v] = dist[u] + w[e]; pre[v] = e;
if(!vis[v])
{
vis[v] = ;
q[++wei] = v;
}
}
}
vis[u] = ;
}
return dist[T] != INF;
} void Deal()
{
int x = INF;
for(int e=pre[T]; e; e=pre[from[e]]) x = min(x,pas[e]);
for(int e=pre[T]; e; e=pre[from[e]])
{
pas[e] -= x;
pas[((e-)^)+] += x;
Ans += x*w[e];
}
} int main()
{
n=get(); a=get(); b=get();
f=get(); fA=get(); fB=get();
S=; T=n*+;
for(int i=;i<=n;i++) X[i]=i, Y[i]=i+n;
for(int i=;i<=n;i++)
{
x = get();
Add(S,X[i], x,);
Add(Y[i],T, x,);
Add(S,Y[i], INF,f);
if(i!=n) Add(X[i],X[i+], INF,);
if(Y[i]+a+ < T)Add(X[i],Y[i]+a+, INF,fA);
if(Y[i]+b+ < T)Add(X[i],Y[i]+b+, INF,fB);
} while(Bfs()) Deal();
printf("%d",Ans); }

【BZOJ1221】【HNOI2001】软件开发 [费用流]的更多相关文章

  1. BZOJ1221 [HNOI2001]软件开发 - 费用流

    题解 非常显然的费用流. 但是建图还是需要思考的QuQ 将每天分成两个节点 $x_{i,1}, x_{i,2} $, $ x_{i,1}$用于提供服务, $x_{i ,2}$ 用来从源点获得$nd[i ...

  2. bzoj 1221 [HNOI2001] 软件开发 费用流

    [HNOI2001] 软件开发 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1938  Solved: 1118[Submit][Status][D ...

  3. 【bzoj1221】[HNOI2001] 软件开发 费用流

    题目描述 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消 ...

  4. BZOJ 1221 [HNOI2001] 软件开发 费用流_建模

    题目描述:   某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供 ...

  5. bzoj1221软件开发 费用流

    题目传送门 思路: 网络流拆点有的是“过程拆点”,有的是“状态拆点”,这道题应该就属于状态拆点. 每个点分需要用的,用完的. 对于需要用的,这些毛巾来自新买的和用过的毛巾进行消毒的,流向终点. 对于用 ...

  6. bzoj1221: [HNOI2001] 软件开发

    挖坑.我的那种建图方式应该也是合理的.然后连样例都过不了.果断意识到应该为神奇建图法... #include<cstdio> #include<cstring> #includ ...

  7. 【费用流】bzoj1221 [HNOI2001] 软件开发

    几乎为“线性规划与网络流24题”中的餐巾问题. 这里把S看成毛巾的来源,T看成软件公司,我们的目的就是让每天的毛巾满足要求(边满流). 引用题解: [问题分析] 网络优化问题,用最小费用最大流解决. ...

  8. BZOJ1221 [HNOI2001] 软件开发 【费用流】

    题目 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消毒毛 ...

  9. BZOJ 1221 软件开发(费用流)

    容易看出这是显然的费用流模型. 把每天需要的餐巾数作为限制.需要将天数拆点,x’表示每天需要的餐巾,x’’表示每天用完的餐巾.所以加边 (s,x',INF,0),(x'',t,INF,0). 餐巾可以 ...

随机推荐

  1. mysql 复杂查询

    1.同一个表下多次查询: sql语句: select b.* ,(select name from exh_common.medicine_type a where b.p_id = a.id) as ...

  2. iOS- 非ARC的项目内存管理细节详解(实战)

    1.前言 接上文:iOS- 如何将非ARC的项目转换成ARC项目(实战) 2.内存管理时相关的配置 当我们把将非ARC的内存管理都管理好后,发现在做有些操作的时候内存还是在一直的缓慢增加 比如做一个最 ...

  3. 在 Range 对象中,Min (14)必须小于或等于 max (-1)。

    DataTable dt = ds.Tables[]; DataRow[] drs = dt.Select("Id=" + categoryID ); 解决方法:将参数用单引号阔起 ...

  4. adb shell input keyevent值所对应的字符

    转自:http://blog.csdn.net/chen825919148/article/details/18732041 0 -->  "KEYCODE_UNKNOWN" ...

  5. VBA 实现学校上课教员一学期中所有上课时间,在一页中通过背景底色反应出来

    需求:学校一学期的所有课程表,每个教员都有可能上好几门课,但给一个教员调课时需要查找所调课时间位置有没有此教员上其它的课 相冲突,手动查找很不方便,这里想通过一个表中位置显示出同一教员在所有课表中出现 ...

  6. .NET中SQL Server数据库连接方法

    1. 使用本机上的SQL Server Express 实例上的用户实例.       用户实例的连接创建了一个新的SQL Server 实例.此连接只能是在本地SQL Server 2005实例上并 ...

  7. EL中定义函数

    1.在java类中要定义一个static函数 2配置:在WEB-INF/*.tld的配置文件 3在JSP页面上 4使用

  8. 【bzoj1901】Zju2112 Dynamic Rankings 离散化+主席树+树状数组

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...

  9. Qt——树结点的搜索

    一.Qt中的树 平时我们经常使用树的结构来组织和展示数据,比如文件系统等—— 在Qt中,我们可以使用Qt提供的便捷的QTreeWidget类,利用该类的接口,轻松地将已有数据显示在树中. 除此之外,还 ...

  10. What’s That NetScaler Reset Packet?

    What’s That NetScaler Reset Packet? https://www.citrix.com/blogs/2014/05/20/whats-that-netscaler-res ...