【BZOJ1221】【HNOI2001】软件开发 [费用流]
软件开发
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
8 2 1 6
Sample Output
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】软件开发 [费用流]的更多相关文章
- BZOJ1221 [HNOI2001]软件开发 - 费用流
题解 非常显然的费用流. 但是建图还是需要思考的QuQ 将每天分成两个节点 $x_{i,1}, x_{i,2} $, $ x_{i,1}$用于提供服务, $x_{i ,2}$ 用来从源点获得$nd[i ...
- bzoj 1221 [HNOI2001] 软件开发 费用流
[HNOI2001] 软件开发 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1938 Solved: 1118[Submit][Status][D ...
- 【bzoj1221】[HNOI2001] 软件开发 费用流
题目描述 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消 ...
- BZOJ 1221 [HNOI2001] 软件开发 费用流_建模
题目描述: 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供 ...
- bzoj1221软件开发 费用流
题目传送门 思路: 网络流拆点有的是“过程拆点”,有的是“状态拆点”,这道题应该就属于状态拆点. 每个点分需要用的,用完的. 对于需要用的,这些毛巾来自新买的和用过的毛巾进行消毒的,流向终点. 对于用 ...
- bzoj1221: [HNOI2001] 软件开发
挖坑.我的那种建图方式应该也是合理的.然后连样例都过不了.果断意识到应该为神奇建图法... #include<cstdio> #include<cstring> #includ ...
- 【费用流】bzoj1221 [HNOI2001] 软件开发
几乎为“线性规划与网络流24题”中的餐巾问题. 这里把S看成毛巾的来源,T看成软件公司,我们的目的就是让每天的毛巾满足要求(边满流). 引用题解: [问题分析] 网络优化问题,用最小费用最大流解决. ...
- BZOJ1221 [HNOI2001] 软件开发 【费用流】
题目 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消毒毛 ...
- BZOJ 1221 软件开发(费用流)
容易看出这是显然的费用流模型. 把每天需要的餐巾数作为限制.需要将天数拆点,x’表示每天需要的餐巾,x’’表示每天用完的餐巾.所以加边 (s,x',INF,0),(x'',t,INF,0). 餐巾可以 ...
随机推荐
- c# dll问题
问题描述: dll完全拷贝另一个程序,可是报缺少引用程序集之类的错误. 解决办法: 有可能是.net版本造成的错误.一般常见在3.5升到4之后,存在很多容差.
- 用URL传参带特殊字符,特殊字符丢失
文章:URL中编码URL特殊字符 文章:用URL传参带特殊字符,特殊字符丢失(encode) 如果url中有特殊字符,需要对url进行编码,否则特殊字符丢失,导致最终接收到的值不对.
- Java之I/O流(第2部分)
1. 节点类类型: 2. 访问文件: Demo_1: import java.io.FileInputStream; import java.io.FileNotFoundException; imp ...
- TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接
一.TCP连接的ISN 之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...
- C#下Label的多行显示
效果如图 1. tableLayout 三行两列 第一行 存放二维码的信息 第二行空白,用于分割 第三行存储LOGO信息 2. Lable4个,Dock属性都为Fill 第一列TextAlign使用M ...
- mysql向上递归&向下递归
工作记录 向上递归函数test: BEGIN ); ); SET sTemp = '$'; SET sTempChd =cast(rid as CHAR); WHILE sTempChd is not ...
- asp.net mvc4使用log4.net 日志功能
对于网站来讲,不能把异常信息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在. 下面演示网站 出错后自动添加出错日志的实例 (1)新建一个WebApplicatio ...
- RT-thread main函数分析
RT-thread系统的main函数位于startup.c文件中. /** * This function will startup RT-Thread RTOS. */ void rtthread_ ...
- RT-thread内核之互斥量
一.互斥量控制块:在include/rtdef.h中 #ifdef RT_USING_MUTEX /** * Mutual exclusion (mutex) structure */ struct ...
- Go语言【第一篇】:Go初识
Go语言特色 简洁.快速.安全 并行.有趣.开源 内存管理.数据安全.编译迅速 Go语言用途 Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言.对于高性能分 ...