【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的代码
原文地址:https://www.cnblogs.com/xzz_233/p/7233871.html