HDU1103
题意:一家店从早上8点开始营业,一共有3种座位(2人座,4人座,6人座),每次来一批客人 吃饭时间30分钟,下一批没座的客人最多等30分钟
模拟!
关键在于存储每种座位什么时候是空的,或者说什么时候客人会离开,可以用队列来存储!(题目给定的就是按时间顺序的)
View Code
1 #include<stdio.h> 2 #include<algorithm> 3 #include<stdlib.h> 4 #include<queue> 5 using namespace std; 6 const int maxn = 1005; 7 struct node{ 8 int t,num; 9 }a[ maxn ]; 10 queue<int>q1; 11 queue<int>q2; 12 queue<int>q3; 13 //1 2 3分别存储着2人座,4人座,6人座的人的离开时间 14 int main(){ 15 int A,B,C; 16 while( scanf("%d%d%d",&A,&B,&C)==3 ,A+B+C ){ 17 int cnt=0; 18 while( !q1.empty() )q1.pop(); 19 while( !q2.empty() )q2.pop(); 20 while( !q3.empty() )q3.pop(); 21 char s[ 10 ]; 22 while( scanf("%s",s)!=EOF ){ 23 if( strcmp( s,"#" )==0 ) 24 break; 25 int time=0,num; 26 time=( s[4]-'0' )+( s[3]-'0' )*10+60*( (s[1]-'0')+10*(s[0]-'0') ); 27 scanf("%d",&num); 28 a[ cnt ].num=num,a[ cnt ].t=time,cnt++; 29 }//input 30 int ans=0; 31 int time1,time2,time3; 32 for( int i=0;i<cnt;i++ ){ 33 /* 34 if( a[i].t>last_time ) 35 break; 36 if( time1>last_time+30||time2>last_time+30||time3>last_time+30 ) 37 break; 38 */ 39 if( a[i].num>=1&&a[i].num<=2 ){ 40 if( A>0 ) { 41 A--; 42 ans+=a[i].num; 43 q1.push( (a[i].t+30) ); 44 }//如果有空位 45 else { 46 time1=q1.front(); 47 if( a[i].t>=time1-30&&a[i].t<=time1 ){ 48 ans+=a[i].num; 49 q1.pop(); 50 q1.push( max(a[i].t+30,time1+30) ); 51 }//等上一波客人30分钟 52 else if( a[i].t>time1 ) { 53 q1.pop(); 54 ans+=a[i].num; 55 q1.push( a[i].t+30 ); 56 }//有空位 57 } 58 }//2 59 else if( a[i].num>=3&&a[i].num<=4 ){ 60 if( B>0 ) { 61 B--; 62 ans+=a[i].num; 63 q2.push( (a[i].t+30) );//the every end time 64 } 65 else { 66 time2=q2.front(); 67 if( a[i].t>=time2-30&&a[i].t<=time2 ){ 68 ans+=a[i].num; 69 q2.pop(); 70 q2.push( max(a[i].t+30,time2+30) ); 71 }//等上一波客人30分钟 72 else if( a[i].t>time2 ) { 73 q2.pop(); 74 ans+=a[i].num; 75 q2.push( a[i].t+30 ); 76 } 77 } 78 }//4 79 else if( a[i].num>=5&&a[i].num<=6 ){ 80 if( C>0 ) { 81 C--; 82 ans+=a[i].num; 83 q3.push( (a[i].t+30) );//the every end time 84 } 85 else { 86 time3=q3.front(); 87 if( a[i].t>=time3-30&&a[i].t<=time3 ){ 88 ans+=a[i].num; 89 q3.pop(); 90 q3.push( max(a[i].t+30,time3+30) ); 91 }//等上一波客人30分钟 92 else if( a[i].t>time3 ) { 93 q3.pop(); 94 ans+=a[i].num; 95 q3.push( a[i].t+30 ); 96 } 97 } 98 }//6 99 } 100 printf("%d\n",ans); 101 } 102 return 0; 103 }
keep moving...