#include<stdio.h> #include<string.h> #include<ctype.h> #include<math.h> #include<iostream> #include<string> #include<set> #include<map> #include<vector> #include<queue> #include<bitset> #include<algorithm> #include<time.h> using namespace std; void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);} #define MS(x,y) memset(x,y,sizeof(x)) #define MC(x,y) memcpy(x,y,sizeof(x)) #define MP(x,y) make_pair(x,y) #define ls o<<1 #define rs o<<1|1 typedef long long LL; typedef unsigned long long UL; typedef unsigned int UI; template <class T1,class T2>inline void gmax(T1 &a,T2 b){if(b>a)a=b;} template <class T1,class T2>inline void gmin(T1 &a,T2 b){if(b<a)a=b;} const int N=0,M=0,Z=1e9+7,ms63=1061109567; int casenum,casei; int A,B,C; int h,m,num,st,ed; char s[100]; int a[1440]; int main() { while(~scanf("%d%d%d",&A,&B,&C),A!=0) { getchar(); MS(a,-1); int ans=0;a[0]=1e9; while(1) { gets(s);if(s[0]=='#')break; sscanf(s,"%d:%d%d",&h,&m,&num); int t=h*60+m; if(num<=2)st=1,ed=A; else if(num<=4)st=A+1,ed=A+B; else if(num<=6)st=A+B+1,ed=A+B+C; int p=0; for(int i=st;i<=ed;i++)if(a[i]<a[p])p=i; if(a[p]-t<=30) { ans+=num; a[p]=max(a[p],t)+30; } } printf("%d\n",ans); } return 0; } /* 【trick&&吐槽】 如果一个人来,那这个人吃完饭的时间不是到达时间+30,而是开吃时间+30。 【题意】 餐厅有3种size(2,4,6)的桌子——数量分别设为A,B,C。 然后有很多波人过来吃饭。 告诉你每波人的抵达时间和人数, 如果当前没有适合的桌子,且30分钟内都没有桌子,那这伙人会离开。 (1,2个人的话用2size桌,3,4个人的话用4size桌,5,6个的话用6size桌) 让你输出最终有多少人在这里吃了饭。 PS: 1,打烊时间是23:00,且22:00之后就不会有人吃饭了 2,每个人的吃饭时间都恰好是30mins 【类型】 模拟 【分析】 桌子数不多。所以我们直接对每个桌子分配人即可。 [1,A]表示size=2的桌子 [A+1,A+B]表示size=2的桌子 [A+B+1,A+B+C]表示size=3的桌子。 记录每个桌子最早空闲时间。以此模拟即可AC。 【时间复杂度&&优化】 O(n^2) */