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
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了。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }