银行排队问题之单队列多窗口加VIP服务(30 分)

本文介绍了一种通过暴力求解的方式解决复杂排队系统的算法实现。该算法针对每个人员的到达时间和办理业务所需时间进行精确计算,确保每个窗口的使用效率最大化,并记录了每个人员的等待时间和离开时间,最终统计出平均等待时间、最大等待时间和总的完成时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个题,就是需要注意一个地方,需要改变这个系列题目方式,需要暴力时间求解,就是对于每一个时间,都有一个标记值,如果这个时间已经被标记过了,然后++

直接找到一个区间可以使这个人能够办完业务,比较恶心,直接暴力写就行,剩下的就是复制粘贴。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <math.h>
#include <stack>
#include <utility>
#include <string>
#include <sstream>
#include <cstdlib>
#include <set>
#define LL long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1000 + 10;
int dir[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
struct Per
{
    int p,t1,vip,wait,leave;
} Index[maxn];
int Win[15][maxn * 60];
int vis[maxn];
int num[20];
int n,m,cnt;
int v;
void slove()
{
    int waitime = 0,maxwait = 0,finishtime = 0;
    for(int i = 0; i < n; i++)
    {
        waitime += Index[i].wait;
        maxwait = max(maxwait,Index[i].wait);
        finishtime = max(finishtime,Index[i].leave);
    }
    printf("%.1lf %d %d\n",waitime*1.0 / n,maxwait,finishtime);
    for(int i = 0; i < m; i++)
    {
        if(!i)
            printf("%d",num[i]);
        else
            printf(" %d",num[i]);
    }
}
int main()
{
    scanf("%d",&n);
    memset(Win,0,sizeof(Win));
    memset(num,0,sizeof(num));
    memset(vis,0,sizeof(vis));
    for(int i = 0; i < n; i++)
    {
        scanf("%d %d %d",&Index[i].p,&Index[i].t1,&Index[i].vip);
        if(Index[i].t1 > 60)
            Index[i].t1 = 60;
        Index[i].wait = Index[i].leave = 0;
    }
    scanf("%d %d",&m,&v);
    cnt = 0;
    for(int t = 0; cnt < n; t++)
    {
        if(Win[v][t] == 0)
        {
            for(int i = 0; i < n; i++)
            {
                if(vis[i]  == 1 || Index[i].vip == 0) continue;
                if(Index[i].p > t) break;
                vis[i] = 1;
                Index[i].wait = t - Index[i].p;
                Index[i].leave = t + Index[i].t1;
                num[v]++;
                cnt++;    //cout<<"^^^^^"<<cnt<<endl;
                for(int j = t; j < t + Index[i].t1; j++)
                    Win[v][j] = 1;
                break;
            }
        }
        for(int j = 0; j < m; j++)
        {
            if(Win[j][t] == 0)
            {
                for(int i = 0; i < n; i++)
                {
                    if(vis[i]  == 1) continue;
                    if(Index[i].p > t) break;
                    vis[i] = 1;
                    Index[i].wait = t - Index[i].p;
                    Index[i].leave = t + Index[i].t1;
                    num[j]++;
                    cnt++;
                    //cout<<"^^^^^"<<cnt<<endl;
                    for(int k = t; k < t + Index[i].t1; k++)
                        Win[j][k] = 1;
                    break;
                }
            }
        }
    }
    slove();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值