PAT甲级 1014 Wait in line

这题比较坑爹的是
17:00之前未开始办理的消费者,给予Sorry;
17:00之后,已开始办理的消费者,继续办理直到办理结束;
题目里面有提到。。。但是很容易很容易就忽略了。。。我英语水平太差了(served!=finished)

还有一点值得一提是用vector会很方便
#include
#include
#include
using namespace std;
const int Max=1005;
struct cou{
int t;
int id;
int pt;
};
vector A[25]; //模拟多行排队的数组
int query[Max]={0}; //疑问的顾客
int N,M,K,Q;
int Cross[25]; //存储正在办理顾客完成的时间
struct tt{
int t;
int pt;
};
struct tt R[Max]; //为了方便查询,结果另存
void print(int t,int pt) //将分钟时间转换成需要的格式输出
{
int h,m;
h=t/60+8;
m=t%60;
if(t-pt<(17-8)60)
printf("%02d:%02d\n",h,m);
else
printf(“Sorry\n”);
return ;
}
int main(){
#ifdef LOCAL
freopen(“Input.txt”,“r”,stdin);
#endif
scanf("%d%d%d%d",&N,&M,&K,&Q);
int T,w,r;
struct cou C;
int mint,min;
for(int i=1;i<=K;i++)
{
scanf("%d",&T);
if(i<=M
N) //未满时的排队
{
r=ceil((double)i/(double)N);
w=i-(r-1)N;
if(r1)
C.t=T;
else if(r>1)
C.t=T+A[w].at(A[w].size()-1).t;
C.id=i;
C.pt=T;
A[w].push_back©;
}
else //满了之后的排队
{
if(i
M
N+1)
{
for(int j=1;j<=N;j++)
Cross[j]=A[j].at(0).t;
}
mint=1000000;
for(int j=1;j<=N;j++) //得到顾客加入的窗口
{
if(Cross[j]<mint)
{
mint=Cross[j];
min=j;
}
}
C.id=i;
C.pt=T;
C.t=T+A[min].at(A[min].size()-1).t; 这个题目的判定数据不够完美,这里假如写成这样也能过
Cross[min]=A[min].at(A[min].size()-M+1).t; // Cross[min]=A[min].at(A[min].size()-1).t;
//Cross[min]=A[min].at(A[min].size()-1).t; //新顾客加入后 ,变化正在办理顾客的完成时间
A[min].push_back©;
}
}
for(int i=1;i<=N;i++)
for(int j=0;j<A[i].size();j++)
{
R[A[i].at(j).id].t=A[i].at(j).t;
R[A[i].at(j).id].pt=A[i].at(j).pt;
}
for(int i=0;i<Q;i++)
scanf("%d",&query[i]);
for(int i=0;i<Q;i++)
print(R[query[i]].t,R[query[i]].pt);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值