【SCOI 2007】修车
【题目】
传送门
题目描述:
同一时刻有 n n n 位车主带着他们的爱车来到了汽车维修中心。维修中心共有 m m m 位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的。现在需要安排这 m m m 位技术人员所维修的车及顺序,使得顾客平均等待的时间最小。
说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。
输入格式:
第一行有两个数 m , n m,n m,n,表示技术人员数与顾客数。
接下来 n n n 行,每行 m m m 个整数。第 i + 1 i+1 i+1 行第 j j j 个数表示第 j j j 位技术人员维修第 i i i 辆车需要用的时间 t t t。
输出格式:
最小平均等待时间,答案精确到小数点后 2 2 2 位。
样例数据:
输入
2 2
3 2
1 4
输出
1.50
说明:
2 ≤ m ≤ 9 2\le m\le9 2≤m≤9, 1 ≤ n ≤ 60 1\le n\le60 1≤n≤60, 1 ≤ t ≤ 1000 1\le t\le1000 1≤t≤1000
【分析】
题目中需要求最短的平均等待时间,也就是求最短的总等待时间
对于一个修车工人,若他按顺序修时间为 t 1 , t 2 , ⋯   , t k t_1,t_2,\cdots,t_k t1,t2,⋯,tk 的车,此时总等待时间为 t 1 ⋅ k + t 2 ⋅ ( k − 1 ) + ⋯ + t k ⋅ 1 t_1\cdot k+t_2\cdot (k-1)+\cdots+t_k\cdot 1 t1⋅k+t2⋅(k−1)+⋯+tk⋅1
那不妨把每个工人拆成 n n n 个点,第 i i i 个点表示这个工人是倒数第 i i i 个修的这辆车
那么就从源点向每辆车连容量为 1 1 1,费用为 0 0 0 的边,从每个阶段的工人向汇点连容量为 1 1 1,费用为 0 0 0 的边;
每辆车向每个阶段的工人连容量为 1 1 1,费用为 t x ⋅ i t_x\cdot i tx⋅i 的边( t x t_x tx 是修当前车的时间, i i i 表示这辆车是这个工人倒数第 i i i 个修的)
建完边之后跑最小费用流就可以了
【代码】
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1005
#define M 100005
#define inf (1ll<<31ll)-1
using namespace std;
int n,m,s,t,tot=1,mincost;
int a[N],f[N],d[N],first[N];
int v[M],w[M],nxt[M],cost[M];
bool vis[N],walk[N];
int id(int i,int j){return (i-1)*m+j+n;}
void add(int x,int y,int f,int c)
{nxt[++tot]=first[x];first[x]=tot,v[tot]=y,w[tot]=f,cost[tot]=c;
}
bool spfa(int s)
{int x,y,i;memset(d,0x3f,sizeof(d));memcpy(f,first,sizeof(f));memset(vis,false,sizeof(vis));memset(walk,false,sizeof(walk));queue<int>q;q.push(s);d[s]=0;while(!q.empty()){x=q.front();vis[x]=false;q.pop();for(i=f[x];i;i=nxt[i]){y=v[i];if(w[i]&&d[y]>d[x]+cost[i]){d[y]=d[x]+cost[i];if(!vis[y]){q.push(y);vis[y]=true;}}}}return d[t]!=0x3f3f3f3f;
}
int dinic(int now,int flow)
{if(now==t)return mincost+=flow*d[t],flow;int x,ans=0,delta;walk[now]=true;for(int &i=f[now];i;i=nxt[i]){x=v[i];if(d[x]==d[now]+cost[i]&&w[i]&&!walk[x]){delta=dinic(x,min(flow,w[i]));w[i]-=delta,w[i^1]+=delta;flow-=delta,ans+=delta;if(!flow) return ans;}}return ans;
}
int main()
{int x,i,j,k;scanf("%d%d",&m,&n);s=0,t=n+m*n+1;for(i=1;i<=n;++i){for(j=1;j<=m;++j){scanf("%d",&x);for(k=1;k<=n;++k)add(i,id(k,j),1,x*k),add(id(k,j),i,0,-x*k);}}for(i=1;i<=n;++i) add(s,i,1,0),add(i,s,0,0);for(i=1;i<=m*n;++i) add(n+i,t,1,0),add(t,n+i,0,0);while(spfa(s)) dinic(s,inf);printf("%.2lf",1.0*mincost/n);return 0;
}
【SCOI 2007】修车相关推荐
- 应用案例 | 2007 款奥迪 A4 车发动机故障灯异常点亮-
一.故障现象 一辆2007款奥迪A4车,搭载BKB发动机,累计行驶里程约为23万km.车主反映,该车曾因机油消耗量过大,在其他修理厂大修过发动机,而大修后出现发动机故障灯异常点亮的故障,为此进行过多次 ...
- 家用汽车维修4:修车工具材料
修车工具材料 (2014-10-27 21:23:46) 工具补遗:http://blog.wenxuecity.com/myblog/36867/201511/326350.html A gener ...
- 将moss 2007的模板文件导入到moss 2010
最近公司HR请请将一个moss2007的调查模板文件导入到我们部门的Moss protal 上面. 我想这是举手之劳,就爽快的答应了. 但是导入时却报如下错误: Error Microsoft Sha ...
- 2007过年休息的日子
今天值班,2007年上班期间难得的轻闲机会了.借此,为老朋友们更新一下我的近况. 年前四五天就请了年休假,准备享受不用上班的日子.以为能过得轻松惬意,想不到没完没了的家务怎么也做不完,似乎每天都是做饭 ...
- Exchange 2007迁移2010时的公用文件夹多个公用树错误
近期在项目中,客户Exchange 从2007迁移到2010,Microsoft Exchange从2007开始就逐渐弱化了公用文件夹,outlook 2007和2010都不需要使用到公用文件夹了.但 ...
- 安装和部署Exchange Server 2007
为什么Exchange Server 2007使用服务器角色? 简化部署和管理 增强可扩展性 改进安全性 见下图: 什么是邮箱服务器角色? 邮箱服务器角色: 存储用户邮箱和公共文件夹 通过群集, ...
- 2007年11月网络工程师考试试题
● 若某计算机系统由两个部件串联构成,其中一个部件的失效率为7×10-6/小时.若不考虑其他因素的影响,并要求计算机系统的平均故障间隔时间为105小时,则另一个部件的失效率应为 (1) /小时. (1 ...
- SharePoint Server 2007 页面模型
虽然SharePoint Server 2007使用了ASP.NET 2.0的基础页面模型,SharePoint页面基本上也是基于标准的aspx技术来构建,但SharePoint Server 200 ...
- 2007年你必须学习的10项.NET技术
1.WCF (Windows Communication Foundation):虽然WCF显然没有WPF或SilverLight那么吸引人,但是它却是在.NET框架下解决业务问题的基础.所以你今年至 ...
最新文章
- 将PS/2接口鼠标改造成USB接口鼠标
- python中的del,remove,pop有什么区别
- 5、VTK在图像处理中的应用
- Delphi中methodaddress的代码解析
- 构建二叉堆时间复杂度的证明
- 实验1 词法分析程序设计
- Android—关于通知NotificationManager操作
- exe编辑器_【小功能】Unreal Editor中调用exe
- 【CSS】当图片加载缓慢时,图片如何自适应高度
- Git 相关使用命令
- Forms Authentication With Absolute Return URLs
- html设置导背景宽度,calc()实现满屏背景定宽内容
- OTT系统和IPTV方案哪个更适合用于搭建局域网视频点播直播
- 药品信息管理系统mysql_药品信息管理系统数据库部分代码
- 鸿蒙第三代手机,华为第三代折叠屏手机面市 余承东披露今年4月旗舰机启用鸿蒙系统...
- yuv420p 详解_YUV格式详解,图文详解YUV420数据格式
- 生日在java中怎么写_怎样用java做个生日提醒?如果同一天有多个人过生日怎么做?...
- 【MATLAB】rem和mod函数的区别
- 微信小程序-退款业务
- 在Visual Basic6.0中,如何实现简单加减乘除的程序编写?