1 条题解

  • 0
    @ 2025-4-8 11:12:45

    🧠 题解思路

    ✅ 餐桌分配逻辑:

    根据人数 NN,可知需要的桌子类型:

    N=1,2N = 1, 2 \rightarrow 需要 2 人桌;

    N=3,4N = 3, 4 \rightarrow 需要 4 人桌;

    N=5,6N = 5, 6 \rightarrow 需要 6 人桌。

    每个顾客组用餐时间固定为 30 分钟,即他们将在 T+30T + 30 分钟后离开,桌子才会变为可用状态。

    ✅ 模拟策略:

    每张桌子维护一个“离开时间队列”;

    每组顾客到达时,释放所有“已过期占用”的桌子;

    若有可用桌子立即安排入座,并设置释放时间;

    若无桌子:

    将其加入等待队列;

    如果等待时间超过 30 分钟,将其移除(他们离开);

    时间单位建议用“分钟数”表示,方便比较与加减。

    ✅ 实现建议

    时间转换函数:HH:MM 转为分钟数;

    使用优先队列(或队列 + 时间排序)处理桌子的释放;

    分别维护每种桌子的占用与等待队列;

    注意餐馆关门时间 23:0023:00,即顾客最晚可在 22:3022:30 入座。

    代码实现

    #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
    上传者