PAT甲级 1026 Table Tennis

    技术2026-01-05  11

    这题真的是做的呕心沥血,首先在这里感谢一下siukwan同志,感谢他的测试数据让我解脱,需要测试数据的点这里。

    下面贴一下我的AC代码,看了那么多别人的AC代码,感觉还是自己的比较简洁。

    这里说一下PAT题库里类似的题目:

    1014Waiting in Line 1017  Queueing at Bank

     

    #include<cstdio> #include<vector> #include<algorithm> #include<cmath> using namespace std; const int maxn=10010; //顾客最大值 const int startTime=8*60*60; //开始时间 08:00 const int endTime=21*60*60; //结束时间21:00 int n,m,k; int num[110]; //记录桌子被使用的次数 struct Client { int arrive; //到达时间 int last; //打球的持续时间 int sever; //被开始服务的时间 int tag; //是否VIP } client[maxn]; vector<int> wait; //等待区队列 vector<int> vipWait; //vip等待区队列 vector<int> vipTable; //记录vip桌子的标号 int table[110]= {0}; //记录桌子距离空闲的时间 bool cmp(int a,int b) { return client[a].arrive<client[b].arrive; } bool cmp1(Client a,Client b) { return a.sever<b.sever; } int main() { scanf("%d",&n); int hh,mm,ss,last,tag; for(int i=0; i<n; i++) { scanf("%d:%d:%d %d %d",&hh,&mm,&ss,&last,&tag); client[i].arrive=hh*3600+mm*60+ss; if(last>120) last=120; //最多只能玩两小时 client[i].last=last*60; client[i].tag=tag; wait.push_back(i); //不管是否是VIP,都需要把顾客标号放入普通等待区 if(tag==1) { vipWait.push_back(i); //VIP放入VIP等待区 } } scanf("%d %d",&m,&k); int tableNum; for(int i=0; i<k; i++) { scanf("%d",&tableNum); vipTable.push_back(tableNum); } //按到达时间从小到大排序 sort(wait.begin(),wait.end(),cmp); sort(vipWait.begin(),vipWait.end(),cmp); int t=startTime-1; while(t<endTime-1) { //循环时间为8:00~20:59:59 t++; for(int i=1; i<=m; i++) { //所有正在使用的桌子倒计时减一秒 if(table[i]!=0) { table[i]--; } } for(int i=0; i<k; i++) { //首先处理k张VIP桌子 int j=vipTable[i]; //如果有空闲的VIP桌子并且有已经到达并等待的VIP用户 if(table[j]==0&&!vipWait.empty()&&t>=client[vipWait[0]].arrive) { int index=vipWait[0]; table[j]=client[index].last; num[j]++; client[index].sever=t; vipWait.erase(vipWait.begin()); //同时在普通等待区和VIP等待区删除该用户 for(vector<int>::iterator it=wait.begin(); it!=wait.end(); it++) { if(*it==index) { wait.erase(it); break; } } } } //接下来对所有的桌子进行遍历,只要有空就取等待区里的顾客加入 for(int i=1; i<=m; i++) { if(table[i]==0) { if(!wait.empty()&&t>=client[wait[0]].arrive) { int index=wait[0]; num[i]++; table[i]=client[index].last; client[index].sever=t; wait.erase(wait.begin()); for(vector<int>::iterator it=vipWait.begin(); it!=vipWait.end(); it++) { if(*it==index) { vipWait.erase(it); break; } } } } } } sort(client,client+n,cmp1); for(int i=0; i<n; i++) { if(client[i].sever==0) { continue; } hh=client[i].arrive/3600; mm=client[i].arrive/60%60; ss=client[i].arrive%60; printf("%02d:%02d:%02d ",hh,mm,ss); hh=client[i].sever/3600; mm=client[i].sever/60%60; ss=client[i].sever%60; printf("%02d:%02d:%02d ",hh,mm,ss); double time=round((client[i].sever-client[i].arrive)*1.0/60); //四舍五入 printf("%d\n",(int)time); } for(int i=1; i<=m; i++) { printf("%d",num[i]); if(i!=m) printf(" "); } return 0; }

    在下写博客是为了给自己查漏补缺以及巩固自己的知识点,如果能帮助到别人那就太好了!

    Processed: 0.046, SQL: 12