标签:编写 程序 申请 mil family pre names memset lag
出纳员的雇佣
Tehran的一家每天24小时营业的超市,需要一批出纳员来满足它的需要。超市经理雇佣你来帮他解决问题:超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多)来为顾客提供优质服务。他希望雇佣最少数目的出纳员。
经理已经提供你一天的每一小时需要出纳员的最少数量——R(0), R(1), ..., R(23)。R(0)表示从午夜到上午1:00需要出纳员的最少数目,R(1)表示上午1:00到2:00之间需要的,等等。每一天,这些数据都是相同的。有N人申请这项工作,每个申请者I在24小时中,从一个特定的时刻开始连续工作恰好8小时,定义tI (0 <= tI <= 23)为上面提到的开始时刻。也就是说,如果第I个申请者被录取,他(她)将从tI 时刻开始连续工作8小时。
你将编写一个程序,输入R(I)(I = 0..23)和tI (I = 1..N),它们都是非负整数,计算为满足上述限制需要雇佣的最少出纳员数目。在每一时刻可以有比对应的R(I)更多的出纳员在工作。
1
1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
5
0
23
22
1
10
1
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 queue<int> Q; 7 const int N=25; 8 int R[N],W[N],dis[N],map[N][N],times[N]; 9 bool go[N][N],in[N]; 10 bool SPFA(int x) 11 { 12 int tmp; 13 memset(dis,127,sizeof(dis)); 14 memset(times,0,sizeof(times)); 15 memset(map,0,sizeof(map)); 16 memset(in,0,sizeof(in)); 17 dis[24]=0; 18 times[24]=1; 19 for(int i=8;i<=24;i++) map[i][i-8]=-R[i]; 20 for(int i=1;i<=7;i++) map[i][i+16]=x-R[i]; 21 for(int i=1;i<=24;i++) map[i-1][i]=W[i]; 22 map[24][0]=-x; 23 Q.push(24); 24 while(!Q.empty()) 25 { 26 tmp=Q.front(); 27 in[tmp]=0; 28 Q.pop(); 29 for(int i=0;i<=24;i++) if(go[tmp][i]&&dis[i]>dis[tmp]+map[tmp][i]) 30 { 31 dis[i]=dis[tmp]+map[tmp][i]; 32 times[i]++; 33 if(!in[i]) 34 { 35 in[i]=1; 36 Q.push(i); 37 } 38 if(times[i]>25) return false; 39 } 40 } 41 return (dis[0]==-x); 42 } 43 int main() 44 { 45 int lower,upper,t,n,x,mid; 46 bool flag; 47 for(int i=8;i<=24;i++) go[i][i-8]=1; 48 for(int i=1;i<=7;i++) go[i][i+16]=1; 49 for(int i=1;i<=24;i++) go[i][i-1]=go[i-1][i]=1; 50 go[24][0]=1; 51 scanf("%d",&t); 52 for(int z=1;z<=t;z++) 53 { 54 memset(W,0,sizeof(W)); 55 for(int i=1;i<=24;i++) scanf("%d",&R[i]); 56 scanf("%d",&n); 57 for(int i=1;i<=n;i++) 58 { 59 scanf("%d",&x); 60 W[x+1]++; 61 } 62 lower=1; 63 upper=n; 64 flag=false; 65 while(lower<=upper) 66 { 67 mid=(lower+upper)>>1; 68 if(SPFA(mid)) 69 { 70 flag=true; 71 upper=mid-1; 72 } 73 else lower=mid+1; 74 } 75 if(!flag) printf("No Solution\n"); 76 else printf("%d\n",lower); 77 } 78 }
标签:编写 程序 申请 mil family pre names memset lag
原文地址:http://www.cnblogs.com/the-unbeatable/p/6359182.html