PAT 1014. Waiting in Line

    xiaoxiao2025-02-03  13

    一开始题意理解错了。

    是17:00之前还没开始服务的就不能服务了。

    不是说不能完成就sorry了。

    另外这种模拟题一旦用数组和很多游标

    自己就很容易出错。

    以后还是要尽量少用了。

    #include<cstdio> #include<cmath> #include<algorithm> #include<cstdlib> #include<iostream> #include<cstring> #include<queue> using namespace std; #define maxn 1111 int que[20][maxn];//记录队列的情况 int pre[20];//记录队列头指针 int cur[20];//记录当前指针 int ans[maxn];//记录每个节点的完成时间 int tim[maxn];//记录每个顾客的时间 int n,m,k,q; int findpre() { int minn,flag,i; minn=maxn; for(i=0;i<n;i++) if(ans[que[i][pre[i]]]<minn) { minn=ans[que[i][pre[i]]]; flag=i; } return flag; } void showtime(int x) { x=x-1; int beg=ans[x]-tim[x]; int i=ans[x]/60; int j=ans[x]%60; if(beg>=540) printf("Sorry\n"); else printf("%02d:%02d\n",i+8,j); } int main() { int i,j,l,x,y; scanf("%d %d %d %d",&n,&m,&k,&q); for(i=0;i<k;i++) scanf("%d",&tim[i]); x=0;//代表第几位顾客 for(i=0;i<m;i++)//队伍的第几个人 for(j=0;j<n;j++)//第几号窗口 { que[j][i]=x; if(i==0) ans[x]=tim[x]; else ans[x]=ans[que[j][i-1]]+tim[x]; x++; } for(i=0;i<n;i++) { pre[i]=0; cur[i]=m; } while(x<k) { y=findpre();//找到队列头所需时间最小的那个队列 que[y][cur[y]]=x; //printf("%d %d %d\n",y,cur[y],x); ans[x]=ans[que[y][cur[y]-1]]+tim[x]; pre[y]++; cur[y]++; x++; } for(i=0;i<q;i++) { scanf("%d",&j); showtime(j); } return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-1296046.html
    最新回复(0)