zoukankan      html  css  js  c++  java
  • 【bzoj1070】[SCOI2007]修车

      

    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)

     

    Source

    此题比较虚,然后看了一眼所鹿神。。。。

    这是一个妙不可言的思想。。。。。。。。

    因为前面的会影响后面的而后面不会影响前面

    考虑到数据这么菜鸡

    可以暴力分点

    把m分成(m,1),..,(m,n)

    表示m倒数第n个修。

    所以它后面有n-1个,加上。。。

    然后对所有时间连边

    就A了。。。

     1 // It is made by XZZ
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 #define rep(a,b,c) for(rg int a=b;a<=c;a++)
     7 #define drep(a,b,c) for(rg int a=b;a>=c;a--)
     8 #define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
     9 #define il inline
    10 #define rg register
    11 #define vd void
    12 #define t (dis[i])
    13 typedef long long ll;
    14 il int gi(){
    15     rg int x=0;rg char ch=getchar();
    16     while(ch<'0'||ch>'9')ch=getchar();
    17     while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    18     return x;
    19 }
    20 const int maxn=60+540+4,S=60+540+1,T=60+540+2,maxm=100000;
    21 int num[10][62];
    22 int id=1,fir[maxn],dis[maxm],nxt[maxm],w[maxm],cost[maxm],Time[10][62];
    23 il vd add(int a,int b,int c,int d){
    24     nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c,cost[id]=d;
    25     if(c)add(b,a,0,-d);
    26 }
    27 il bool Super_Fast(int&Cost){
    28     int que[maxn],hd=0,tl=1,Dis[maxn],last[maxn]={0};bool inque[maxn]={0};
    29     memset(Dis,127/3,sizeof Dis);Dis[S]=0;
    30     que[0]=S,inque[S]=1;
    31     while(hd^tl){
    32     int now=que[hd];hd=(hd+1)%maxn,inque[now]=0;
    33     erep(i,now)
    34         if(Dis[now]+cost[i]<Dis[t]&&w[i]){
    35         Dis[t]=Dis[now]+cost[i],last[t]=i;
    36         if(!inque[t])que[tl++]=t,inque[t]=1,tl%=maxn;
    37         }
    38     }
    39     if(!last[T])return false;
    40     rg int flow=666666666;
    41     for(rg int i=last[T];i;i=last[dis[i^1]])flow=min(flow,w[i]);
    42     for(rg int i=last[T];i;i=last[dis[i^1]])w[i]-=flow,w[i^1]+=flow,Cost+=cost[i]*flow;
    43     return true;
    44 }
    45 il int mincost(int Cost=0){
    46     while(Super_Fast(Cost));
    47     return Cost;
    48 }
    49 int main(){
    50     rg int m=gi(),n=gi(),Id;
    51     Id=n;
    52     rep(i,1,n)rep(j,1,m)Time[j][i]=gi();
    53     rep(i,1,m)rep(j,1,n)num[i][j]=++Id,add(S,num[i][j],1,0);
    54     rep(i,1,n)add(i,T,1,0);
    55     rep(i,1,m)rep(j,1,n)rep(k,1,n)
    56     add(num[i][j],k,1,Time[i][k]*j);
    57     printf("%.2lf
    ",mincost()/(double)n);
    58     return 0;
    59 }
    800+ms的代码
  • 相关阅读:
    STR[#6]
    整数
    一些应该记住的东西(持续更新?再也不会更新了)
    退役后的续命杂谈
    51Nod 快速傅里叶变换题集选刷
    支配树学习笔记
    动态点分治入门随讲
    KD树小结
    HNOI2013 BZOJ3142 数列
    BZOJ2001 HNOI2010 城市建设
  • 原文地址:https://www.cnblogs.com/xzz_233/p/7233871.html
Copyright © 2011-2022 走看看