PTA 1014 Waiting in Line

没过,先存一下代码
题意:排队处理业务
思路:模拟队列,每秒处理一个任务
注意点:…..看了一下题解,发现自己理解错题意了…在17点前开始的业务都可以完成,所以时间有可能会超出17:00
还是在自己复杂的代码的基础上修改,有时间会重新写一下

#include<bits/stdc++.h>
using namespace std;
struct que{
    vector<int>pel;
    vector<int>index;
}q[20];
int ans[1005],ask[1005];
int main(){
    int n,m,k,qe;
    cin>>n>>m>>k>>qe;
    for(int i=1;i<=k;i++){
        cin>>ask[i];
    }
    memset(ans,-1,sizeof(ans));
    //ans是对应下标顾客的开始服务时间 
    //先排队
    int consumer=1; 
    for(int i=1,j=0;i<=k;i++,j=(j+1)%n,consumer++){
        if((q[j].pel.size()==m)&&(j==0))
            break;
    //  cout<<q[j].pel.size()<<endl;
        if(q[j].index.size()==0){
            ans[i]=0;
        }else{
            //前一个排队人的下标 
            int tmpindex=q[j].index[q[j].index.size()-1];
            ans[i]=ans[tmpindex]+ask[tmpindex];
        //  cout<<ans[i]<<endl;
        }
        q[j].pel.push_back(ask[i]);
        q[j].index.push_back(i);
    } 
    //每秒做工 
    for(int i=1;i<=540;i++){
        for(int j=0;j<n;j++){//每个队第一个人做工 
            if(q[j].pel.size()==0)
                continue;
            q[j].pel[0]= q[j].pel[0]-1;
            if(q[j].pel[0]==0){//前一个人做完,再进入一个人 
                vector<int>::iterator it =q[j].pel.begin(); 
                q[j].pel.erase(it);
                it=q[j].index.begin();
                int tmpindex = *it;
                q[j].index.erase(it);
                if(consumer<=k){//再进入一个人 
                    if(q[j].index.size()==0){
                        ans[consumer]=ans[tmpindex]+ask[tmpindex];
                    }else{
                        //前一个排队人的下标 
                        int frontindex=q[j].index[q[j].index.size()-1];
                        ans[consumer]=ans[frontindex]+ask[frontindex];
                    }
                    q[j].pel.push_back(ask[consumer]);
                    q[j].index.push_back(consumer);

                    consumer++;
                }else{
                    continue;
                }
            }
        }
    }

    for(int i=0;i<qe;i++){
        int qer;
        cin>>qer;
        if(ans[qer]==-1||ans[qer]>=540)//不是在5点前 
        cout<<"Sorry\n";
        else{
        int hour=8+(ans[qer]+ask[qer])/60,mini=(ans[qer]+ask[qer])%60;
        printf("%02d:%02d\n",hour,mini);            
        }

    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值