PAT甲1014 Waiting in Line (30)

先将M*N客户按序排队,同时计算每个客户的开始服务时间和结束服务时间,和每个队列的下一次服务时间。
之后每排一个客户,对队伍按下一次服务时间升序排序,将客户排入第一个队伍,计算其开始服务时间和结束服务时间,同时该队的下次服务时间加上一个队头客户的服务耗费时间。

注意!!是17:00以后才开始接受服务的客户输出sorry,若在17点之前开始接受服务,但结束时间超出17点,正常输出结束时间。

#include <stdio.h>
#include <stdlib.h>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <map> 
#include <vector>
#include <queue>
using namespace std;

int N,M,K,Q;

struct line
{
    int id;
    vector<int> c;
    int endtime;
    int costtime;
    int x;
}l[30];

struct customer
{
    int starttime;
    int endtime;
    int cost;
}c[1010];

void init()
{
    for(int i=0;i<N;i++)
    {
        l[i].endtime=0;
        l[i].costtime=0;
        l[i].id=i;
        l[i].x=-1;
    }
}

bool cmp(line a,line b)
{
    if(a.costtime!=b.costtime)return a.costtime<b.costtime;
    else return a.id<b.id;
}

void change(int time,int st)
{
    if(st>=540)
    {
        printf("Sorry\n");
        return;
    }
    int hour=8;
    int minute=0;
    while(time>=60)
    {
        time=time-60;
        hour++;
    }
    minute=time;
        printf("%02d:%02d\n",hour,minute);
}

int main()
{
    scanf("%d%d%d%d",&N,&M,&K,&Q);
    init();
    int num=0;
    for(num=0;num<M*N&&num<K;num++)
    {
        int index=num%N;
        scanf("%d",&c[num].cost);
        l[index].c.push_back(num);
        c[num].starttime=l[index].endtime;
        c[num].endtime=l[index].endtime+c[num].cost;
        l[index].endtime+=c[num].cost;
        l[index].x=0;
        int dangqian=l[index].c[l[index].x];
        l[index].costtime=c[dangqian].endtime;
    }
    while(num<K)
    {
        scanf("%d",&c[num].cost);
        sort(l,l+N,cmp);
        c[num].starttime=l[0].endtime;
        c[num].endtime=l[0].endtime+c[num].cost;
        l[0].endtime+=c[num].cost;
        l[0].x++;
        int dangqian=l[0].c[l[0].x];
        l[0].costtime=c[dangqian].endtime;
        l[0].c.push_back(num);
        num++;
    }
    int que;
    for(int i=0;i<Q;i++)
    {
        scanf("%d",&que);
        change(c[que-1].endtime,c[que-1].starttime);
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yhy489275918/article/details/80442598