Description###

同一时刻有N位车主带着他们的爱车来到了汽车维修中心。维修中心共有M位技术人员,不同的技术人员对不同

的车进行维修所用的时间是不同的。现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待的时间最

小。 说明:顾客的等待时间是指从他把车送至维修中心到维修完毕所用的时间。

Input###

第一行有两个m,n,表示技术人员数与顾客数。 接下来n行,每行m个整数。第i+1行第j个数表示第j位技术人

员维修第i辆车需要用的时间T。

Output###

最小平均等待时间,答案精确到小数点后2位。

Sample Input###

2 2

3 2

1 4

Sample Output###

1.50

HINT###

数据范围: (2<=M<=9,1<=N<=60), (1<=T<=1000)


想法##

这道题还是挺经典的。

我们考虑到每个技术人员那里修车的人等待的总时间,发现那其实就是

\[最后一个人修车时间 \times 1 + 倒数第二人修车时间 \times 2 + … + 第一人修车时间 \times x \\
(x表示到这个技术人员处修车的总人数)
\]

于是,我们把每个技术人员拆成n个点,代表某个技术人员修的第几辆车,共mn个点

每个顾客向这mn个点连边,边权为\(t \quad 2t \quad 3t \quad …\),容量为1

S向每个顾客连容量1费用0的边,那mn个点向T连容量1费用0的边。

跑一遍费用流即可。


代码##

注意:输入时先输m再输n!!!

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<queue>
  5. #define INF 2100000000
  6. using namespace std;
  7. const int N = 81+65+81*65;
  8. struct node{
  9. int v,f,c;
  10. node *next,*rev;
  11. }pool[N*150],*h[N],*pree[N];
  12. int cnt;
  13. void addedge(int u,int v,int f,int c){
  14. node *p=&pool[++cnt],*q=&pool[++cnt];
  15. p->v=v;p->next=h[u];h[u]=p; p->f=f;p->c=c;p->rev=q;
  16. q->v=u;q->next=h[v];h[v]=q; q->f=0;q->c=-c;q->rev=p;
  17. }
  18. int S,T;
  19. queue<int> que;
  20. int vis[N],d[N],pre[N];
  21. bool spfa(){
  22. int u,v;
  23. while(!que.empty()) que.pop();
  24. for(int i=S;i<=T;i++) d[i]=INF;
  25. d[S]=0; vis[S]=1; que.push(S);
  26. while(!que.empty()){
  27. u=que.front(); que.pop();
  28. vis[u]=0;
  29. for(node *p=h[u];p;p=p->next)
  30. if(p->f && d[v=p->v]>d[u]+p->c){
  31. d[v]=d[u]+p->c;
  32. pre[v]=u; pree[v]=p;
  33. if(!vis[v]) { vis[v]=1; que.push(v); }
  34. }
  35. }
  36. return d[T]!=INF;
  37. }
  38. int MCMF(){
  39. int f=0,c=0,u,w;
  40. while(spfa()){
  41. u=T; w=INF;
  42. while(u!=S){
  43. w=min(w,pree[u]->f);
  44. u=pre[u];
  45. }
  46. f+=w; c+=w*d[T];
  47. u=T;
  48. while(u!=S){
  49. pree[u]->f-=w;
  50. pree[u]->rev->f+=w;
  51. u=pre[u];
  52. }
  53. }
  54. return c;
  55. }
  56. int n,m;
  57. int main()
  58. {
  59. int x;
  60. scanf("%d%d",&m,&n); /**/
  61. S=0; T=m*n+n+1;
  62. for(int i=1;i<=n;i++){
  63. addedge(S,i,1,0);
  64. for(int j=1;j<=m;j++){
  65. scanf("%d",&x);
  66. for(int k=0;k<n;k++)
  67. addedge(i,n+k*m+j,1,x*(k+1));
  68. }
  69. }
  70. for(int i=1;i<=m;i++)
  71. for(int k=0;k<n;k++) addedge(n+k*m+i,T,1,0);
  72. double ans=MCMF();
  73. printf("%.2lf\n",ans/(double)n);
  74. return 0;
  75. }

[bzoj1070] [洛谷P2053] [SCOI2007] 修车的更多相关文章

  1. 洛谷 P2053 [SCOI2007]修车 解题报告

    P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...

  2. 洛谷 P2053 [SCOI2007]修车(最小费用最大流)

    题解 最小费用最大流 n和m是反着的 首先, \[ ans = \sum{cost[i][j]}*k \] 其中,\(k\)为它在当前技术人员那里,排倒数第\(k\)个修 我们可以对于每个技术人员进行 ...

  3. 洛谷 P2053 [SCOI2007]修车

    题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...

  4. 洛谷$P2053\ [SCOI2007]$修车 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 一个很妙的建图,,,说实话我麻油想到$QwQ$ 考虑对每个工人建$n$个点,表示这是他修的倒数第$i$辆车,就可以算出影响是$t\cdot i$,然后对每辆 ...

  5. P2053 [SCOI2007]修车(费用流)

    P2053 [SCOI2007]修车 顾客平均等待的最小时间$=$等待总时间$/n$ 考虑只有1个技术人员时,$n$辆车等待总时间 $A_1+(A_1+A_2)+(A_1+A_2+A_3)+...+\ ...

  6. 洛谷P2053 修车

    修车修到jiry报废(滑稽) 题意:m个人修n个车,同时开始. 每辆车只能给一个人修.每个人修每辆车的用时都不同. 问怎样安排能使每辆车的等待时间总和最少. 解: 一直想的是用以流量表示一个人,没想到 ...

  7. P2053 [SCOI2007]修车

    思路 很妙的网络流题目 最开始我简单的想直接把n个车的点和m个人员的点直接用cap=t(i,j)的边连起来,显然是假的,因为没有考虑到车主等待的时间长度 然后考虑分析将\(w_1,w_2,\dots, ...

  8. P2053 [SCOI2007]修车 费用流

    $ \color{#0066ff}{ 题目描述 }$ 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M ...

  9. 洛谷P2470 [SCOI2007]压缩(区间dp)

    题意 题目链接 Sol 神仙题Orz 考虑区间dp,如果我们只设\(f[l][r]\)表示\(s_{lr}\)被压缩的最小长度,而不去关心内部\(M\)分布的话,可能在转移的时候转移出非法状态 因此考 ...

随机推荐

  1. 使用Ant Design写一个仿微软ToDo

    实习期的第一份活,自己看Ant Design的官网学习,然后用Ant Design写一个仿微软ToDo. 不做教学目的,只是记录一下. 1.学习 Ant Design 是个组件库,想要会用,至少要知道 ...

  2. Activiti工作流引擎学习(一)

    1.部署对象和流程定义相关表:RepositoryService act_re_deployment: 部署对象表:一次部署的多个文件的信息,对于不需要的流程可以删除和修改 act_re_procde ...

  3. ZR普转提2

    ZR普转提2 A 谢谢刁神教我A题 刚开始读错题了,以为是一个不可做的数位DP,然后就暴力滚粗 直到问了问刁神,发现自己题意是错的 然后成了比较简单的题目 直接暴力枚举每一位填什么,剩下的位数的数字都 ...

  4. 2019-2-11-WPF-列表自动换行

    title author date CreateTime categories WPF 列表自动换行 lindexi 2019-02-11 08:55:31 +0800 2019-02-11 08:5 ...

  5. slim中返回结果加密的

    //返回结果不加密 $this->get("/open]",function (Request $request, Response $response, $args) {  ...

  6. Linux使用expect和rsync实现密码自动输入无人值守自动同步备份

    我们常用sudo,ssh.ftp命令操作服务器或者修改权限的时候都会要求输入password,但是shell脚本运行中该如何交互实现自动输入密码呢? 下面总结三种实现方法. 一.重定向:用重定向方法实 ...

  7. 第二阶段:1.流程图:11.PPT绘制页面流程图

    产品经理主要绘制两个图:1.业务流程图(谁在什么条件下完成什么任务)2.页面流程图(具体到产品呈现的功能设计等等细节方面) 选择插入 选择流程图中的形状 设置两个矩形 同时添加不同的背景色 添加文本框 ...

  8. 记一次linux磁盘清理 - 已经删除的文件占用了大量磁盘空间

    今天开发环境磁盘占满了,导致开发环境上的 nginx .redis 等组件总是报异常. 跳到系统根目录下 cd / 检查磁盘占用情况 df -h 哇,40G硬盘全用完了.看看是哪些文件占了那么多内存. ...

  9. [工具] Git版本管理(三)(工作流)

    一.冲突解决 Beyond Compare软件 下载BCompare软件,并安装. 删除安装目录下的BCUnrar.dll文件. 使用码: w4G-in5u3SH75RoB3VZIX8htiZgw4E ...

  10. 并发编程的基石——CAS机制

    本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 Java中提供了很多原子操作类来保证共享变量操作的原子性 ...