1014. Waiting in Line (30)

来源:互联网 发布:数控车g73编程实例详解 编辑:程序博客网 时间:2024/06/15 06:34

转载: http://www.seven.moe/?p=165

//题目要点:进入黄线前是一个队列
//进入黄线后,每个窗口前面都是一个队列
//客户进入黄线后,不论别的队列发生了什么,均不得再改变队列
这里写图片描述

/*pat官网是用的C++11标准,但VC++6.0不支持。所以,最好使用VS2015里的插件:代码一键发布GitHub在VS2015中,需要添加宏定义来屏蔽4996Error:  #pragma warning(disable:4996)目的:在ACM中进行快速输入用法:freopen("input.txt",r,stdin);其中input.txt文件位置放在和源.cpp文件在同一个文件夹下system("pause") 在VS2015中,如果不加这一行代码,程序会直接结束,没有按任意键继续 这一句话。所以你想要看到结果,你就得加上这句话。提交到pat官网:注释掉这三个:#pragma warning(disable:4996)freopen("input.txt",r,stdin);system("pause");*/#include<iostream>#include<queue>#include<algorithm> //LeaveTime/60//#pragma warning(disable:4996)using namespace std;struct node{    int FirstTime;    int LastTime;    queue<int> WaitList;};struct{    int NeedTime;    int WaitTime;}Customer[10001];int main(){    //freopen("input.txt","r",stdin);    int n,m,k,q; int queryxuhao[1001]={0};    for(int i=1;i<=10000;i++){//顾客从1开始        Customer[i].NeedTime=0;        Customer[i].WaitTime=0;    }    vector<node> Window(21);    for(i=0;i<20;i++){//窗口从0开始        Window[i].FirstTime=0;        Window[i].LastTime=0;    }    cin>>n>>m>>k>>q;    for(i=1;i<=k;i++) cin>>Customer[i].NeedTime;    for(i=0;i<q;i++) cin>>queryxuhao[i];    int InsideNum=n*m,WaitNum=k-n*m;    //黄线内    for(i=0;i<InsideNum;i++){        Window[i%n].WaitList.push(i+1);        Customer[i+1].WaitTime=Window[i%n].LastTime;        Window[i%n].LastTime+=Customer[i+1].NeedTime;    }    for(i=0;i<n;i++){        Window[i].FirstTime+=Customer[Window[i].WaitList.front()].NeedTime;        Window[i].WaitList.pop();    }    //黄线外    for(i=0;i<WaitNum;i++){        int flag=-1;int min=999999;//初始设为无穷大        for(int j=0;j<n;j++){            if(Window[j].FirstTime<min){                min=Window[j].FirstTime;                flag=j;            }        }        Window[flag].FirstTime+=Customer[Window[flag].WaitList.front()].NeedTime;        Window[flag].WaitList.pop();        Window[flag].WaitList.push(n*m+i+1);        Customer[n*m+i+1].WaitTime=Window[flag].LastTime;        Window[flag].LastTime+=Customer[n*m+i+1].NeedTime;    }    for(i=0;i<q;i++){        int LeaveTime=Customer[queryxuhao[i]].WaitTime+Customer[queryxuhao[i]].NeedTime;        if(Customer[queryxuhao[i]].WaitTime>=540){        //本题容易出错的地方:是在17:00及以后开始服务的客户输出"Sorry",而不是17:00之前结束服务的输出"Sorry";            //如客户cId是16:59开始服务,服务时间为2,则输出的应该是17:01,而不是"Sorry"。            cout<<"Sorry"<<endl;        }else{            int hour=8+LeaveTime/60;            int minute=LeaveTime%60;            if(hour<10) cout<<"0"<<hour<<":";            else cout<<hour<<":";            if(minute<10) cout<<"0"<<minute<<endl;            else cout<<minute<<endl;        }    }   //system(pause);    return 0;}
0 0