【HDU1103】【模拟】Flo's Restaurant 餐厅吃饭排桌子

来源:互联网 发布:网络会员系统 编辑:程序博客网 时间:2024/04/29 03:58
#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|1typedef 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)*/

1 0
原创粉丝点击