1 条题解
-
0
🧠 题解思路
✅ 餐桌分配逻辑:
根据人数 ,可知需要的桌子类型:
需要 2 人桌;
需要 4 人桌;
需要 6 人桌。
每个顾客组用餐时间固定为 30 分钟,即他们将在 分钟后离开,桌子才会变为可用状态。
✅ 模拟策略:
每张桌子维护一个“离开时间队列”;
每组顾客到达时,释放所有“已过期占用”的桌子;
若有可用桌子立即安排入座,并设置释放时间;
若无桌子:
将其加入等待队列;
如果等待时间超过 30 分钟,将其移除(他们离开);
时间单位建议用“分钟数”表示,方便比较与加减。
✅ 实现建议
时间转换函数:HH:MM 转为分钟数;
使用优先队列(或队列 + 时间排序)处理桌子的释放;
分别维护每种桌子的占用与等待队列;
注意餐馆关门时间 ,即顾客最晚可在 入座。
代码实现
#include<stdio.h> #include<string.h> #include<algorithm> #include<cstdlib> using namespace std; int main() { int t[1000],f[1000],s[1000]; int a,b,c; int sn=60*23; while(~scanf("%d%d%d",&a,&b,&c)) //234桌的人数 { if(a==0&&b==0&c==0) break; int tt=0,time; memset(t,0,sizeof(t)); memset(f,0,sizeof(f)); memset(s,0,sizeof(s)); char shi[1000]; while(1) { int k; scanf("%s",shi); //输入来的时间 if(shi[0]=='#') break; scanf("%d",&k); //输入人数 int x=(shi[0]-'0')*10+shi[1]-'0'; int y=(shi[3]-'0')*10+shi[4]-'0'; time=x*60+y; //求来的时间 if(time>sn) continue; if(k==1||k==2) { sort(t,t+a); if(time+30>=t[0]) { if(time>=t[0]) { t[0]=time+30; tt+=k; } else { t[0]+=30; tt+=k; } } } else if(k==3||k==4) { sort(f,f+b); if(time+30>=f[0]) { if(time>=f[0]) { f[0]=time+30; tt+=k; } else { f[0]+=30; tt+=k; } } } else if(k==5||k==6) { sort(s,s+c); if(time+30>=s[0]) { if(time>=s[0]) { s[0]=time+30; tt+=k; } else { s[0]+=30; tt+=k; } } } } printf("%d\n",tt); } return 0; }
- 1
信息
- ID
- 1425
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者