[HAOI2010]订货

题目描述

某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费。假设仓库容量为S。

输入输出格式

输入格式:

第1行:n, m, S (0<=n<=50, 0<=m<=10, 0<=S<=10000)

第2行:U1 , U2 , ... , Ui , ... , Un (0<=Ui<=10000)

第3行:d1 , d2 , ..., di , ... , dn (0<=di<=100)

输出格式:

只有1行,一个整数,代表最低成本

输入输出样例

输入样例#1: 复制

3 1 1000
2 4 8
1 2 4 

输出样例#1: 复制

34

题解:

还是一道很裸很裸的题。(怎么办,最近只会刷水题)

思路来的很快,很明显是一道费用流。

  1.将源点分别和每个点建边,控制每个点的购买费用。

  2.每个点向下一个点建边,控制贮存费用。

  3.每个点向汇点建边。

然后跑个费用流就好。

 1 //Never forget why you start
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<cstring>
 6 #include<cmath>
 7 #include<algorithm>
 8 #include<queue>
 9 #define inf (2000000000)
10 using namespace std;
11 int n,m,S;
12 struct node{
13   int next,to,cap,cost;
14 }edge[1005];
15 int head[1005],size=1;
16 void putin(int from,int to,int cap,int cost){
17   size++;
18   edge[size].next=head[from];
19   edge[size].to=to;
20   edge[size].cap=cap;
21   edge[size].cost=cost;
22   head[from]=size;
23 }
24 void in(int from,int to,int cap,int cost){
25   putin(from,to,cap,cost);
26   putin(to,from,0,-cost);
27 }
28 int pre[1005],vis[1005],dist[1005];
29 bool bfs(int src,int des){
30   int i;
31   queue<int>mem;
32   memset(dist,127/3,sizeof(dist));
33   memset(pre,0,sizeof(pre));
34   dist[src]=0;
35   mem.push(src);
36   while(!mem.empty()){
37     int x=mem.front();mem.pop();
38     for(i=head[x];i!=-1;i=edge[i].next){
39       int y=edge[i].to;
40       if(edge[i].cap>0&&dist[y]>dist[x]+edge[i].cost){
41     dist[y]=dist[x]+edge[i].cost;
42     pre[y]=i;
43     mem.push(y);
44       }
45     }
46   }
47   return pre[des]!=0;
48 }
49 int change(int src,int des){
50   int ans=0,i,flow=inf;
51   for(i=des;i!=src;i=edge[pre[i]^1].to)
52     flow=min(flow,edge[pre[i]].cap);
53   for(i=des;i!=src;i=edge[pre[i]^1].to){
54     edge[pre[i]].cap-=flow;
55     edge[pre[i]^1].cap+=flow;
56     ans+=edge[pre[i]].cost*flow;
57   }
58   return ans;
59 }
60 int min_cost_flow(int src,int des){
61   int ans=0;
62   while(bfs(src,des)){
63     ans+=change(src,des);
64   }
65   return ans;
66 }
67 int main(){
68   int i,j;
69   memset(head,-1,sizeof(head));
70   scanf("%d%d%d",&n,&m,&S);
71   for(i=1;i<=n;i++){
72     scanf("%d",&j);
73     in(i,n+1,j,0);
74   }
75   for(i=1;i<=n;i++){
76     scanf("%d",&j);
77     in(0,i,inf,j);
78   }
79   for(i=2;i<=n;i++)
80     in(i-1,i,S,m);
81   printf("%d\n",min_cost_flow(0,n+1));
82   return 0;
83 }

原文地址:https://www.cnblogs.com/huangdalaofighting/p/8269225.html

时间: 2024-10-13 02:32:01

[HAOI2010]订货的相关文章

bzoj2424: [HAOI2010]订货

最小费用最大流即可.-=a[t] 写成了-=-a[t],于是为此找了很久的错QAQsading #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define clr(x,c) memset(

BZOJ 2424: [HAOI2010]订货 费用流

2424: [HAOI2010]订货 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2424 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后

【BZOJ2424】[HAOI2010]订货 最小费用流

[BZOJ2424][HAOI2010]订货 Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费.假设仓库容量为S. Input 第1行:n, m, S (0<=n<=50, 0<=m<=10, 0<=S&

BZOJ 2424: [HAOI2010]订货(最小费用最大流)

最小费用最大流..乱搞即可 ------------------------------------------------------------------------------ #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<queue> #define rep( i, n ) for( int i = 0; i <

bzoj2424: [HAOI2010]订货(费用流)

2424: [HAOI2010]订货 题目:传送门 题解: 做多了最小割,做一下费用流练手 其实很容易就看出来是费用流啊,伏地魔肉老师用单调队列ORZ st直接连每个月,流量无限(随便买,花钱而已),费用就是给出来的 然后因为可以贮存嘛,那就第i个月连第i+1个月,流量为S(仓库容量),费用为m就OK 最后就是卖出去咯,第i个月连ed流量为需要的,费用为0 难受,打个spfa忘记出队列... 代码: 1 #include<cstdio> 2 #include<cstring> 3

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*m,k<=min(j+U[i],S)$ 复杂度$O(nS^2)$ 把上面的方程拆项 $f[i][j]=(j+U[i])*D[i]+j*m+{f[i-1][k]-k*D[i]},k<=min(j+U[i],S)$ 这个$k$可以直接跟着$j$维护,连单调队列都不用开 复杂度$O(nS)$ #inc

bzoj:2424: [HAOI2010]订货

Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,进库并供应市场,于当月被售掉则不必付存贮费.假设仓库容量为S. Input 第1行:n, m, S (0<=n<=50, 0<=m<=10, 0<=S<=10000) 第2行:U1 , U2

[haoi2010]订货 最小费用流

这道题oj上的标签是动态规划,但我想不出来动态规划怎么搞,空间不爆,时间也要爆的: 好的,不扯淡,此题正常做法是最小费用流: 这道题我写了两遍,为什么呢?原因是第一次写的时候,不会写费用流,又恰好没带书,所以搁置了: 第二次又写到这道题了,有点生气,一鼓作气学了费用流,紧跟着敲了这道题: 也算一道费用流模板吧: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstrin

[HAOI2010][BZOJ2424] 订货

2424: [HAOI2010]订货 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 639  Solved: 426[Submit][Status][Discuss] Description 某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初的库存量为零,第n月月底的库存量也为零,问如何安排这n个月订购计划,才能使成本最低?每月月初订购,订购后产品立即到货,