【HAOI2010】订货
可以DP也可以是费用流,然而被我用非常简单的DP破了【开心】
原题:
某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费。假设仓库容量为S。
0<=n<=50,0<=m<=10,0<=S<=10000,0<=Ui<=10000,0<=di<=100
恩紫萱的讲解说要用队列优化DP,我太弱没看懂,自己想出了一个我觉得比较妙的方法DP掉了
核心思路是在买东西的时候f[i]只与f[i-1]的最优值有关(注意是最优值)
然后要买的时候从1到S顺推,f[i]=min(f[i],f[i-1]+d[i])
恩原理我语文不好,直接丢个图吧

可以理解为f[i-1]代表了1到i-1所有的方案,但是都没有f[i]优,再往上考虑的话,由于增加的费用都是一样的,所以和f[1]到f[i-1]有关的方案不会优于f[i]相关的方案,就只考虑f[i]了
如果f[i]不是更优,f[i-1]代表了f[1]到f[i-1]的方案,只管使用即可
然后还有许多需要注意的细节(我就是因为细节问题拖了很久才A quq)
首先货物是可以进货不入库直接卖,不占用仓库空间,所以实际上仓库有M+a[i]的储存空间(每个月的需求也可能超过仓库容量),然后每个月结束的时候f中1到M不用处理,下个月直接转移即可,但是M+1到M+a[i]这一段一定要处理成正无穷,不然会影响到下个月(我就是因为这个细节卡了一下午,差点弃疗quq)
还有更多的细节问题,大家自己体验吧一。一
DP代码非常短
代码(DP):
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
const int oo=;
int n,m,ns; int a[],b[];
int f[];
int main(){//freopen("ddd.in","r",stdin);
memset(f,,sizeof(f));
cin>>n>>ns>>m;
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=n;i++) b[i]=read();
f[]=; a[]=;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++) f[j]=f[j+a[i-]]+j*ns;
for(int j=m+;j<=m+a[i-];j++) f[j]=oo;
for(int j=;j<=m+a[i];j++) f[j]=min(f[j],f[j-]+b[i]);
}
cout<<f[a[n]]<<endl;
return ;
}
======================================================下面是费用流======================================================
至于费用流呐,建图也非常好想
首先利用割的思想,每个月到汇一条流量为需求,费用0的边,割掉这条边表示这个月的费用满足了
然后源到每个月一条流量正无穷,费用为这个月进货费用的边,表示物品可以随意买
每个月到下个月一条流量为仓库容量,费用为储存话费的边,表示上个月的货可以继承到下个月
至于我是怎么想出来的……直觉……我觉得还要继续发掘一下这其中潜在的思路规律
代码也很简单,标准的费用流模板:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
const int oo=;
struct ddd{int next,y,evalue,rev,cost;}e[]; int LINK[],ltop=;
inline void insert(int x,int y,int z,int _cost){
e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;e[ltop].evalue=z;e[ltop].rev=ltop+;e[ltop].cost=_cost;
e[++ltop].next=LINK[y];LINK[y]=ltop;e[ltop].y=x;e[ltop].evalue=;e[ltop].rev=ltop-;e[ltop].cost=-_cost;
}
int n,m,ns; int s,t;
int dist[];
int QUEUE[],head=; bool visited[];
int last[],last_e[];
bool spfa(){
memset(visited,,sizeof(visited));
memset(dist,,sizeof(dist));
QUEUE[head=]=s; dist[s]=;
for(int k=;k<=head;k++){
for(int i=LINK[QUEUE[k]];i;i=e[i].next)
if(e[i].evalue && dist[QUEUE[k]]+e[i].cost<dist[e[i].y]){
dist[e[i].y]=dist[QUEUE[k]]+e[i].cost;
last[e[i].y]=QUEUE[k],last_e[e[i].y]=i;
if(!visited[e[i].y]) QUEUE[++head]=e[i].y,visited[e[i].y]=true;
}
visited[QUEUE[k]]=false;
}
return dist[t]<oo;
}
int cost_flow(){
int bowl=;
while(spfa()){
int min_flow=oo;
for(int i=t;i!=s;i=last[i]) min_flow=min(min_flow,e[last_e[i]].evalue);
for(int i=t;i!=s;i=last[i]){
bowl+=min_flow*e[last_e[i]].cost;
e[last_e[i]].evalue-=min_flow,e[e[last_e[i]].rev].evalue+=min_flow;
}
}
return bowl;
}
int main(){//freopen("ddd.in","r",stdin);
cin>>n>>ns>>m; s=,t=n+;
for(int i=;i<=n;i++) insert(i,t,read(),);
for(int i=;i<=n;i++) insert(s,i,oo,read());
for(int i=;i<n;i++) insert(i,i+,m,ns);
cout<<cost_flow()<<endl;
return ;
}
【HAOI2010】订货的更多相关文章
- BZOJ 2424: [HAOI2010]订货
2424: [HAOI2010]订货 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 915 Solved: 639[Submit][Status][ ...
- 2424: [HAOI2010]订货
2424: [HAOI2010]订货 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 922 Solved: 642[Submit][Status][ ...
- BZOJ 2424: [HAOI2010]订货 费用流
2424: [HAOI2010]订货 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月 ...
- BZOJ 2424: [HAOI2010]订货(最小费用最大流)
最小费用最大流..乱搞即可 ------------------------------------------------------------------------------ #includ ...
- 【BZOJ2424】[HAOI2010]订货(费用流)
[BZOJ2424][HAOI2010]订货(费用流) 题面 BZOJ 洛谷 题解 傻逼费用流吧... 一开始理解错意思了,仓库大小为\(m\)的含义是留到下个月最多为\(m\),而不是任意时刻的容量 ...
- 【BZOJ2424】[HAOI2010]订货 最小费用流
[BZOJ2424][HAOI2010]订货 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定 ...
- bzoj2424 [HAOI2010]订货 dp+单调性
[HAOI2010]订货 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1311 Solved: 884[Submit][Status][Discu ...
- BZOJ_2424_[HAOI2010]订货_最小费用最大流
BZOJ_2424_[HAOI2010]订货_最小费用最大流 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付 ...
- P2517 [HAOI2010]订货(dp)
P2517 [HAOI2010]订货 设$f[i][j]$表示第$i$个月,库存为$j$的最小代价 枚举上个月的库存$k$,那么$f[i][j]=f[i-1][k]+(j+U[i]-k)*D[i]+j ...
- bzoj2424 [HAOI2010]订货
模拟一下仓库里面存储物品的价格情况即可,如果当前物品大于仓库里面物品那么就替换一下仓库里的物品,然后订货直接从仓库里先取,仓库里不够则直接购买,每次做完后记得买当前物品填补一下仓库直至仓库填满,当然这 ...
随机推荐
- PHP消息队列之Beanstalk
Beanstalk,一个高性能.轻量级的分布式内存队列
- javascript实现select菜单/级联菜单(用Rails.ajax实现发送请求,接收响应)
在购物网站,填写收货地址的时候,会出现XX省XX市XX区的下拉菜单,如何实现此功能?思路是什么? 功能设置: 当选择省select菜单后,市的select菜单为这个省的城市列. 当选择市菜单后,区菜单 ...
- Android之侧滑菜单DrawerLayout的使用
在android support.v4 中有一个抽屉视图控件DrawerLayout.使用这个控件,可以生成通过在屏幕上水平滑动打开或者关闭菜单,能给用户一个不错的体验效果. DrawerLayout ...
- 在 Confluence 6 中连 Jira 的问题解决
下面是可能会发生的一些错误信息.如果你的系统中出现了下面的一些提示,你应该调整你的日志错误级别到 WARN,然后查看具体的错误原因.请参考:Configuring Logging. error.jir ...
- Confluence 6 使用 LDAP 授权连接一个内部目录概述
你可以为你的 Confluence 连接 LDAP 服务器使用使用委托认证.这个意思是 Confluence 将会设置一个内部目录,这个目录仅被用来处理 LDAP 的授权. 这个设置将会为尝试登录系统 ...
- django的url的name参数的意义
Templates的链接地址都是根据urlpatterns定义的地址,拼凑成地址字符串,很难看,而且Templates里拼凑成的地址,随着页面的增加而不断增加,一旦在urlpatterns里的某个地址 ...
- python-day43--多表查询
一.多表连接查询: #重点:外链接语法 准备表 #建表 create table department( id int, name varchar(20) ); create table ...
- Oracle11g温习-第七章:redo日志
2013年4月27日 星期六 10:33 1.redo (重做) log 的功能: 用于数据恢复 2.redo log 特征: [特征]: 1) 记录数据块的变化(DML.D ...
- Leetcode 22
//这题感觉不如前两题回溯清楚,还要再看看class Solution { public: vector<string> generateParenthesis(int n) { vect ...
- svn更新产生的异常
同步svn时差生的错误如下: 同步 SVNStatusSubscriber 时报告了错误.1 中的 0 个资源已经同步. 同步 /tunnel14 时发生错误:Error getting stat ...