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. (注:1≤f,fA,fB≤60,1≤n≤1000)

Output

最少费用

Sample Input

4 1 2 3 2 1
8 2 1 6

Sample Output

38

题解

经典构图题。

将每一天拆成两个点$i$,$i’$,

加如下$6$条边:

$(sta, i, ni, f)$——在第$i$天可以买至多$ni$个餐巾,每块$f$分;

$(i, fin, ni, 0)$——第$i$天要用$ni$块餐巾;

$(sta, i’, ni, 0)$——第$i$天用剩的$ni$块旧餐巾;

$(i’, i+a+1, ∞, fa)$——第$i$天的旧餐巾送到快洗部,每块$fa$分;

$(i’, i+b+1, ∞, fb)$——第$i$天的旧餐巾送到慢洗部,每块$fb$分;

$(i’, i’+1, ∞, 0)$——第$i$天的旧餐巾可以留到第$i+1$天再处理;

求一次最小费用流即为结果。

 #include <set>
#include <map>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define LL long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define Min(a, b) ((a) < (b) ? (a) : (b))
using namespace std;
const int N = 2e3;
const int INF = ~0u>>; int n,a,b,f,fa,fb,ni;
struct tt{
int to, cost, next, cap;
}edge[N*+];
int path[N+], top = -;
void Add(int u, int v, int cap, int cost);
int sta, fin;
int min_cost_flow();
int SPFA(); int main(){
memset(path, -, sizeof(path));
scanf("%d%d%d%d%d%d", &n, &a, &b, &f, &fa, &fb);
sta = , fin = *n+;
for (int i = ; i <= n; i++){
  scanf("%d", &ni);
  Add(sta, i, ni, f);
   Add(i, fin, ni, );
   Add(sta, i+n, ni, );
  if (i+a+ <= n) Add(i+n, i+a+, INF, fa);
  if (i+b+ <= n) Add(i+n, i+b+, INF, fb);
  if (i+ <= n) Add(i+n, i++n, INF, );
}
printf("%d\n", min_cost_flow());
return ;
} void Add(int u, int v, int cap, int cost){
edge[++top].to = v;
edge[top].cost = cost;
edge[top].cap = cap;
edge[top].next = path[u];
path[u] = top;
edge[++top].to = u;
edge[top].cost = -cost;
edge[top].cap = ;
edge[top].next = path[v];
path[v] = top;
}
int min_cost_flow(){
int tolcost = ;
int tmp;
while (tmp = SPFA()) tolcost += tmp;
return tolcost;
}
int SPFA(){
int dist[N+];
memset(dist, /, sizeof(dist)); dist[sta] = ; dist[fin] = INF;
bool vis[N+] = {}; vis[sta] = ;
queue<int>Q;
while (!Q.empty()) Q.pop();
Q.push(sta);
int pre[N+] = {};
while (!Q.empty()){
  int u = Q.front(); Q.pop(); vis[u]=;
  for (int i = path[u]; i != -; i = edge[i].next){
  int v = edge[i].to;
   if (dist[v] > dist[u]+edge[i].cost && edge[i].cap > ){
     dist[v] = dist[u]+edge[i].cost;
     pre[v] = i;
     if (!vis[v]){
     vis[v] = ;
     Q.push(v);
     }
   }
  }
}
if (dist[fin] == INF) return ;
int minflow = INF;
for (int i = fin; i != sta; i = edge[pre[i]^].to)
   minflow = Min(minflow, edge[pre[i]].cap);
for (int i = fin; i != sta; i = edge[pre[i]^].to)
  edge[pre[i]].cap -= minflow,
  edge[pre[i]^].cap += minflow;
return dist[fin]*minflow;
}

[HNOI 2001]软件开发的更多相关文章

  1. 敏捷软件开发VS传统软件工程

    敏捷软件开发:又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新兴软件开发方法,是一种应对快速变化的需求的一种软件开发能力. 与传统软件工程相比,它们的具体名称.理念.过程.术语都不尽相同 ...

  2. [转] Agile Software Development 敏捷软件开发

    原文作者:kkun 原文地址:http://www.cnblogs.com/kkun/archive/2011/07/06/agile_software_development.html 敏捷是什么 ...

  3. 敏捷软件开发 VS. 传统软件工程

    敏捷软件开发 VS. 传统软件工程 软件工程这一术语1968年被提出,之后美国软件工程专家巴利·玻姆对十多年间研究软件工程的专家学者们提出的一些准则与信条,于1983年对提出软件工程的七条基本定理,将 ...

  4. 敏捷软件开发vs传统软件开发

    摘要 本文介绍了传统软件开发(着重介绍了传统软件开发中常用的瀑布模型)和敏捷软件开发,以及敏捷开发和传统开发的对比. 一.传统软件开发 比较常用的几种传统软件开发方法:瀑布式开发.迭代式开发.螺旋开发 ...

  5. 敏捷软件开发 Agile software Development(转)

    原文链接: http://www.cnblogs.com/kkun/archive/2011/07/06/2099253.html 敏捷软件开发 Agile software Development ...

  6. 【BZOJ】1221: [HNOI2001] 软件开发(最小费用最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1221 先吐槽一下,数组依旧开小了RE:在spfa中用了memset和<queue>的版本 ...

  7. 软件开发模式,DevOps

    参考文献:http://www.cnblogs.com/jetzhang/p/6068773.html 历史回顾 为了能够更好的理解什么是DevOps,我们很有必要对当时还只有程序员(此前还没有派生出 ...

  8. Agile Development敏捷软件开发之何为敏捷开发

    敏捷软件开发之何为敏捷开发 敏捷开发,Agile Development,就是指能够在需求迅速变化的情况下快速开发软件.我们接触最多敏捷实践方式有:极限编程(XP).结对编程.测试驱动开发(TDD)等 ...

  9. atitit.提高开发效率---mda 革命性的软件开发方法

    atitit.提高开发效率---mda 革命性的软件开发方法 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和事实上现相分离 2 3. 眼下的问题模型和代码不同步 2 4.  ...

随机推荐

  1. Sublime Text3下使用Python,REPL的安装与快捷键设置方法

    前提条件:连接外网   1.安装管理插件(CTRL+SHIFT+P),找到Package Control:install package一项,回车后继续选择SublimeREPL插件,进行安装:   ...

  2. 安利给班里的大家一个chrome的GitHub插件-----gayhub

    title: 一个好用的Github插件--gayhub date: 2017-09-20 15:41:36 tags: --- 别跑, 这真是正经插件. 效果, 一图流: 具体效果在项目地址很详细 ...

  3. 冲刺No.3

    Alpha冲刺第三天 站立式会议 项目进展 今日团队对CSS与JS的基础知识进行了应用,并对网站的UI设计进行了讨论,对数据库设计进行了进一步的探讨,基本确立了各个表单的结构和内容.分割出项目基本模块 ...

  4. fflush(stdin)与fflush(stdout)

    1.fflush(stdin): 作用:清理标准输入流,把多余的未被保存的数据丢掉.. 如: int main() { int num; char str[10]; cin>>num; c ...

  5. Flask Session 详解

    会话session ,允许你在不同请求 之间储存信息.这个对象相当于用密钥签名加密的 cookie ,即用户可以查看你的 cookie ,但是如果没有密钥就无法修改它. from flask impo ...

  6. 【iOS】swift-文字宽度的计算

    如图所示,需要sectionView的标题宽度可以动态变化 举例说明: 只需在tableView的代理方法 func tableView(tableView: UITableView, viewFor ...

  7. VMware虚拟机误删除vmdk文件后如何恢复?

    故障描述: Dell R710系列服务器(用于VMware虚拟主机),Dell MD 3200系列存储(用于存放虚拟机文件),VMware ESXi 5.5版本,因意外断电,导致某台虚拟机不能正常启动 ...

  8. OO面向对象课程作业1-3总结

    作业一.多项式的加减运算 1.设计要点与自我分析 我设计的类图 老师建议类图 我设计了两个类来进行多项式的计算,类Polynomial进行多项式的存储和输入输出,第二个类进行多项式加减运算.而加减运算 ...

  9. WebApi 方法的参数类型总结。

    1:[HttpGet]  ①:get方法之无参数. [HttpGet] public IHttpActionResult GetStudentInfor() { List<StudentMode ...

  10. JAVA_SE基础——63.String类的常用方法

    获取方法int length()  获取字符串的长度char charAt(int index) 获取特定位置的字符 (角标越界)int indexOf(String str) 查找子串第一次出现的索 ...