软件开发

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

  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<cstdlib>
  7. #include<cmath>
  8. using namespace std;
  9. typedef long long s64;
  10.  
  11. const int ONE = ;
  12. const int EDG = ;
  13. const int INF = ;
  14.  
  15. int n,a,b,f,fA,fB;
  16. int x;
  17. int X[ONE],Y[ONE];
  18. int S,T;
  19. int next[EDG],first[ONE],go[EDG],from[EDG],pas[EDG],w[EDG],tot;
  20. int dist[ONE],pre[ONE],vis[ONE];
  21. int tou,wei,q[ONE];
  22. int Ans;
  23.  
  24. inline int get()
  25. {
  26. int res=,Q=; char c;
  27. while( (c=getchar())< || c>)
  28. if(c=='-')Q=-;
  29. if(Q) res=c-;
  30. while((c=getchar())>= && c<=)
  31. res=res*+c-;
  32. return res*Q;
  33. }
  34.  
  35. void Add(int u,int v,int flow,int z)
  36. {
  37. next[++tot]=first[u]; first[u]=tot; go[tot]=v; from[tot]=u; pas[tot]=flow; w[tot]=z;
  38. next[++tot]=first[v]; first[v]=tot; go[tot]=u; from[tot]=v; pas[tot]=; w[tot]=-z;
  39. }
  40.  
  41. bool Bfs()
  42. {
  43. for(int i=S;i<=T;i++) dist[i] = INF;
  44. dist[S] = ; vis[S] = ;
  45. tou = ; wei = ; q[] = S;
  46. while(tou < wei)
  47. {
  48. int u = q[++tou];
  49. for(int e=first[u]; e; e=next[e])
  50. {
  51. int v = go[e];
  52. if(dist[v] > dist[u] + w[e] && pas[e])
  53. {
  54. dist[v] = dist[u] + w[e]; pre[v] = e;
  55. if(!vis[v])
  56. {
  57. vis[v] = ;
  58. q[++wei] = v;
  59. }
  60. }
  61. }
  62. vis[u] = ;
  63. }
  64. return dist[T] != INF;
  65. }
  66.  
  67. void Deal()
  68. {
  69. int x = INF;
  70. for(int e=pre[T]; e; e=pre[from[e]]) x = min(x,pas[e]);
  71. for(int e=pre[T]; e; e=pre[from[e]])
  72. {
  73. pas[e] -= x;
  74. pas[((e-)^)+] += x;
  75. Ans += x*w[e];
  76. }
  77. }
  78.  
  79. int main()
  80. {
  81. n=get(); a=get(); b=get();
  82. f=get(); fA=get(); fB=get();
  83. S=; T=n*+;
  84. for(int i=;i<=n;i++) X[i]=i, Y[i]=i+n;
  85. for(int i=;i<=n;i++)
  86. {
  87. x = get();
  88. Add(S,X[i], x,);
  89. Add(Y[i],T, x,);
  90. Add(S,Y[i], INF,f);
  91. if(i!=n) Add(X[i],X[i+], INF,);
  92. if(Y[i]+a+ < T)Add(X[i],Y[i]+a+, INF,fA);
  93. if(Y[i]+b+ < T)Add(X[i],Y[i]+b+, INF,fB);
  94. }
  95.  
  96. while(Bfs()) Deal();
  97. printf("%d",Ans);
  98.  
  99. }

【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. c# dll问题

    问题描述: dll完全拷贝另一个程序,可是报缺少引用程序集之类的错误. 解决办法: 有可能是.net版本造成的错误.一般常见在3.5升到4之后,存在很多容差.

  2. 用URL传参带特殊字符,特殊字符丢失

    文章:URL中编码URL特殊字符 文章:用URL传参带特殊字符,特殊字符丢失(encode) 如果url中有特殊字符,需要对url进行编码,否则特殊字符丢失,导致最终接收到的值不对.

  3. Java之I/O流(第2部分)

    1. 节点类类型: 2. 访问文件: Demo_1: import java.io.FileInputStream; import java.io.FileNotFoundException; imp ...

  4. TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接

    一.TCP连接的ISN         之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...

  5. C#下Label的多行显示

    效果如图 1. tableLayout 三行两列 第一行 存放二维码的信息 第二行空白,用于分割 第三行存储LOGO信息 2. Lable4个,Dock属性都为Fill 第一列TextAlign使用M ...

  6. mysql向上递归&向下递归

    工作记录 向上递归函数test: BEGIN ); ); SET sTemp = '$'; SET sTempChd =cast(rid as CHAR); WHILE sTempChd is not ...

  7. asp.net mvc4使用log4.net 日志功能

    对于网站来讲,不能把异常信息显示给用户,异常信息只能记录到日志,出了问题把日志文件发给开发人员,就能知道问题所在. 下面演示网站 出错后自动添加出错日志的实例 (1)新建一个WebApplicatio ...

  8. RT-thread main函数分析

    RT-thread系统的main函数位于startup.c文件中. /** * This function will startup RT-Thread RTOS. */ void rtthread_ ...

  9. RT-thread内核之互斥量

    一.互斥量控制块:在include/rtdef.h中 #ifdef RT_USING_MUTEX /** * Mutual exclusion (mutex) structure */ struct ...

  10. Go语言【第一篇】:Go初识

    Go语言特色 简洁.快速.安全 并行.有趣.开源 内存管理.数据安全.编译迅速 Go语言用途 Go语言被设计成一门应用于搭载Web服务器,存储集群或类似用途的巨型中央服务器的系统编程语言.对于高性能分 ...