首页 > 其他分享 >P1251 餐巾计划问题

P1251 餐巾计划问题

时间:2023-03-26 15:25:45浏览次数:28  
标签:P1251 int 餐巾 add 计划 go include hd

一个餐厅在相继的 N 天里,每天需用餐巾。假设第 i天需要 A[i]块餐巾( i=1,2,...,N)。

餐厅可以购买新的餐巾,每块餐巾的费用为 p 分;

或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分;  或者送到慢洗部,洗一块需 nn 天(n>mn>m),其费用为 ss 分(s<fs<f)。

每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗。

注意每天洗好的餐巾和购买的新餐巾数之和,要满足当天的需求量。

试设计一个算法为餐厅合理地安排好 NN 天中餐巾使用计划,使总的花费最小。

 

 将每天当作一个点,而且拆点(上午和晚上),然后连边

 

#include<iostream>
#include<queue> 
#include<cstring>
#define IOS std::ios::sync_with_stdio(0)
using namespace std;
 const int N =1e5, M=1e5+100;
 #define int long long
 #define inf 1e9
 int all=1,hd[N],go[M],w[M],nxt[M],cost[M];
  
 int S,T,n,m;
 int pre[N],mn[N],dis[N],vis[N],ans=0;
  
 void add_(int x,int y,int z,int c){
     nxt[++all]=hd[x]; hd[x]=all; go[all]=y;
     w[all]=z; cost[all]=c;
      
     swap(x,y);
     nxt[++all]=hd[x]; hd[x]=all; go[all]=y;
     w[all]=0; cost[all]= -c;
 }
  
 bool spfa(){
    int i;
    queue<int> q;
    q.push(S);
    for(i=0;i<N;i++) dis[i]=inf;
    for(i=1;i<N;i++) vis[i]=0;
    mn[S]=inf, dis[S]=0, vis[S]=1;
     
    while(!q.empty()){
        int x=q.front();
        vis[x]=0;
        q.pop();
        for(i=hd[x];i;i=nxt[i]){
            int y=go[i],z=w[i],c=cost[i];
            if(w[i]==0) continue;
             
            if(dis[x]+c<dis[y]){
                dis[y]=dis[x]+c;
                mn[y]=min(mn[x],z);
                pre[y]=i;
                if(vis[y]==0) vis[y]=1,q.push(y);
            }
        }
    }
    if(dis[T]==inf) return 0; return 1;
 }
 void solve(){
    int maxf=0, minc=0;
    while(spfa()){
        int x= T;
        maxf+=  mn[T] ,minc+= mn[T]*dis[T];
         
        while(x!=S){
            int i=pre[x];
            w[i]-= mn[T];
            w[i^1]+=mn[T];
            x=go[i^1];
        }
    }
    cout<<minc<<endl;
 }
 int T1,M1,T2,M2;
 
 signed main(){
 	int i,x;
 	cin>>n; S=0,T=2*n+1;
 	
 	for(i=1;i<=n;i++){
 		cin>>x; add_(S,i,x,0); add_(i+n,T,x,0);
 	}
 	cin>>m>>T1>>M1>>T2>>M2;
 	for(i=1;i<=n;i++){
 		if(i+1<=n) add_(i,i+1,inf,0); 
 		if(i+T1<=n) add_(i,i+n+T1,inf,M1);
 		if(i+T2<=n) add_(i,i+n+T2,inf,M2);
 		add_(S,i+n,inf,m);
 	}
 	solve(); 
 }
 
 
 

 

 

 

标签:P1251,int,餐巾,add,计划,go,include,hd
From: https://www.cnblogs.com/towboa/p/17258723.html

相关文章

  • explain解析执行计划的各个参数
    如图所示,explain中包含的信息有:id:查询序列号MySQL会为每个select语句分配一个唯一的id值,用来表示查询中执行select子句或者操作表的顺序。如果只是单纯的查一个表,......
  • 1074 津津的储蓄计划
    include<iostream>usingnamespacestd;intmain(){intn=0,x,s=0,a,b=0,y=1;for(inti=1;i<=12;i++){cin>>x;n=n+300-x;if(......
  • 传统开发计划和敏捷开发计划
            ......
  • 项目计划书(软件项目)
    注意:本项目是机票预订系统这个模板是还是不错的,整个项目计划书老师最后打分是95分,你看:引言编写目的本机票预定系统在可行性研究的基础上,是为了进一步明确机票预订系统......
  • coe_xfr_sql_profile.sql脚本绑定执行计划
    ***原文:https://www.modb.pro/db/570546大家在实际数据库运维中,总会遇到这样的问题:1、某个sql非常慢或者突然变得非常慢,查看后发现sql选择了错误的执行计划。如果这个sql......
  • 研究计划的写作攻略
    书写研究计划是一项需要灵感的工作,对于在国外读书的同学来讲,写研究计划存在一定难度,研究计划的作用有许多,对学业发展的影响不可忽视,所以即便是撰写存在困难,也应当想办法克服......
  • SAP ABAP 创建DN交货单常见报错:对干直到所选日期的交货没有到期的计划行
      检查:1.该销售订单是否已完成交货;2.交货日期是否在计划交货日期之后或者是同一天;3.交货日期是否在物料可用日期之前;4.行项目的确认数量是否大于0;5.物料是否库存......
  • Edu Round 板刷计划 1. Educational Codeforces Round 1 题解
    ChangeLog:2023.03.21开坑。A-TrickySum简单题。注意到\(n\)以内\(2\)的幂次只有\(O(\logn)\)个,因此只要先算出\(1\)~\(n\)里所有数的和再减去\(2\)......
  • 计划中的开源工具类 (ainusers原创)
    #开源工具类计划1.废弃Mapper.xml数据库字段和java代码字段映射关系工具类(Voruta/cglib)2.提供基于MYSQL的yml文件SQL文本规则,以及默认的方法的极简易ORM框架3.废弃P......
  • 因果推断dowhy之-评估会员奖励计划的效果
    0x01.案例背景评估订阅或奖励计划对客户的影响的例子。假设一个网站有会员奖励计划,如果客户注册,他们会得到额外的好处。我们如何知道该会员奖励计划是有用的?翻译成因果推断......