[HNOI2001]软件开发
题目描述
某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的 服务,其中一项服务就是要为每个开发人员每天提供一块消毒毛巾,这种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种,A种方式的消毒需要 a天时间,B种方式的消毒需要b天(b>a),A种消毒方式的费用为每块毛巾fA, B种消毒方式的费用为每块毛巾fB,而买一块新毛巾的费用为f(新毛巾是已消毒的,当天可以使用);而且f>fA>fB。公司经理正在规划在 这n天中,每天买多少块新毛巾、每天送多少块毛巾进行A种消毒和每天送多少块毛巾进行B种消毒。当然,公司经理希望费用最低。
你的任务就是:为该软件公司计划每天买多少块毛巾、每天多少块毛巾进行A种消毒和多少毛巾进行B种消毒,使公司在这项n天的软件开发中,提供毛巾服务的总费用最低。
输入输出格式
输入格式:
第1行为n,a,b,f,fA,fB.
第2行为n1,n2,……,nn. (注:1≤f,fA,fB≤60,1≤n≤1000)
输出格式:
最少费用
输入输出样例
38
建立附加源点和汇点S和T
1. 源点到第i天的入点连容量ni费用为0的边
2. 第i天的出点到汇点连容量ni费用为0的边
3. 源点到第i天的出点连容量为INF费用为f的边
4. 第i天的入点到第i+a+1(i+b+1)天的出点连容量为INF费用为fa(fb)的边
5. 第i天的入点到第i+1天的入点连容量为INF费用为0的边
S连出的边表示这一天会剩下ni个脏布,连向T表示这一天要用ni个布
一天用完的ni个布,可以由a(b)方式给第i+a+1(i+b+1)天,也可以不洗,留到下一天再洗
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct Node
{
int next,to,c,dis,u;
}edge[];
int num=,head[],inf=2e9,dis[],pre[];
long long ans;
int d[],n,a,b,fa,fb,f;
bool vis[];
void add(int u,int v,int c,int d)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
edge[num].dis=d;
edge[num].c=c;
edge[num].u=u;
num++;
edge[num].next=head[v];
head[v]=num;
edge[num].to=u;
edge[num].dis=-d;
edge[num].c=;
edge[num].u=v;
}
bool SPFA()
{int INF,i;
memset(pre,-,sizeof(pre));
memset(vis,,sizeof(vis));
memset(dis,/,sizeof(dis));
INF=dis[];
dis[]=;
queue<int>Q;
Q.push();
while (Q.empty()==)
{
int u=Q.front();
Q.pop();
vis[u]=;
for (i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if (edge[i].c&&dis[v]>dis[u]+edge[i].dis)
{
dis[v]=dis[u]+edge[i].dis;
pre[v]=i;
if (vis[v]==)
{
vis[v]=;
Q.push(v);
}
}
}
}
if (dis[*n+]==INF) return ;
return ;
}
void change()
{int i;
int T=*n+;
int minf=inf;
for (i=pre[T];i!=-;i=pre[edge[i].u])
{
minf=min(minf,edge[i].c);
}
for (i=pre[T];i!=-;i=pre[edge[i].u])
{
edge[i].c-=minf;
edge[i^].c+=minf;
}
ans+=minf*dis[T];
}
int main()
{int i;
cin>>n>>a>>b>>f>>fa>>fb;
for (i=;i<=n;i++)
scanf("%d",&d[i]);
for (i=;i<=n;i++)
add(,i,d[i],),add(i+n,*n+,d[i],),add(,i+n,inf,f);
for (i=;i<=n-;i++)
add(i,i+,inf,);
for (i=;i<=n;i++)
{
if (i+a+<=n) add(i,i+a++n,inf,fa);
if (i+b+<=n) add(i,i+b++n,inf,fb);
}
while (SPFA()) change();
cout<<ans;
}
[HNOI2001]软件开发的更多相关文章
- BZOJ 1221: [HNOI2001] 软件开发
1221: [HNOI2001] 软件开发 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1428 Solved: 791[Submit][Stat ...
- bzoj1221: [HNOI2001] 软件开发
挖坑.我的那种建图方式应该也是合理的.然后连样例都过不了.果断意识到应该为神奇建图法... #include<cstdio> #include<cstring> #includ ...
- BZOJ 3280: 小R的烦恼 & BZOJ 1221: [HNOI2001] 软件开发
3280: 小R的烦恼 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 399 Solved: 200[Submit][Status][Discuss ...
- BZOJ 1221: [HNOI2001] 软件开发(最小费用最大流)
不知道为什么这么慢.... 费用流,拆点.... --------------------------------------------------------------------------- ...
- 【BZOJ 1221】 1221: [HNOI2001] 软件开发 (最小费用流)
1221: [HNOI2001] 软件开发 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1581 Solved: 891 Description ...
- bzoj 1221 [HNOI2001] 软件开发 费用流
[HNOI2001] 软件开发 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1938 Solved: 1118[Submit][Status][D ...
- 【BZOJ】1221: [HNOI2001] 软件开发(最小费用最大流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1221 先吐槽一下,数组依旧开小了RE:在spfa中用了memset和<queue>的版本 ...
- 1221. [HNOI2001]软件开发【费用流】
Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...
- 【bzoj1221】[HNOI2001] 软件开发 费用流
题目描述 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消 ...
随机推荐
- 四则运算----C++版
一.设计思想 因java中已做过,就是简单的将java中的语句调换为C++的语句. 二.代码 #include<iostream.h> #include<Stdlib.h> v ...
- c/cpp语言链表连接部分详解
核心代码: ①pTail->next = pNew; ②pNew->next = NULL; ③pTail = pNew; 设结构体名称为 struct ST: 注:方框代表分配的内存空间 ...
- window.showModalDialog
//新版本谷歌没有window.showModalDialog,创建一个window.openif(window.showModalDialog == undefined){ window.show ...
- 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- cocos2d 判断旋转矩形是否包含某个点
本来想画个图演示一下,但是折腾了一会发现画不好,我的win10系统没有安装office,以后再看的话再补上吧.不废话了. 如图所以,如果判断点P是否被矩形A所包含,非常容易.那么如果矩形A以中心点逆时 ...
- http客户端请求及服务端详解
http客户端请求及服务端详解 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...
- C++ 实现一个信号量
C++ 实现一个信号量 信号量有很多应用场景,事实上只要是生产者-消费者模型,一般都需要一个信号量来控制. POSIX接口是有PV信号量API的.但C++标准没有.下面是一个PV信号量的简单实现.有些 ...
- apigw鉴权分析(1-5)亚马逊 - 鉴权分析
一.访问入口 https://developer.amazon.com/public/zh 二.鉴权方式分析 三.分解结论
- C#微信公众号开发——access_token的获取
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_toke ...
- MFC基础
入门博客:http://www.cnblogs.com/qinfengxiaoyue/category/451679.html 消息机制:http://www.cnblogs.com/qinfengx ...