【PAT】1026. Table Tennis
来源:互联网 发布:中国软件排名 编辑:程序博客网 时间:2024/05/08 16:03
考查点:模拟题
提交情况:这道题题意要理清楚,尤其是其中的隐含信息,第一次用优先队列结果没有考虑空闲VIP桌要优先的情况,第二次出现段错误和各种错误,段错误是遍历下一个vip队员时候直接把当前位置+1还有在循环中没有判断位置指针小于总人数,所以访问下标越界,还有关系符写反了,搞了半天,还有两个小时的细节忘记处理了,这道题独题时候要理解好题意。
思路:用向量保存队员,table数组记录服务人数,其他基本暴力搜索即可通过,主要还是理清楚各种关系,分类好各种情况
#define LOCAL#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <vector>#include <map>#include <set>#include <queue>#include <stack>#define FOR(i, x, y) for(int i = x; i <= y; i++)#define rFOR(i, x, y) for(int i = x; i >= y; i--)#define MAXN 10010#define oo 0x3f3f3f3fusing namespace std;struct Person{ int start,play,vip,wait;}pn;int table[11100];int viptab[11100];struct tab{ int id,endtime;}tm,qtable[11100];bool cmp(Person a,Person b){ return a.start<b.start;}bool cmpr(Person a,Person b){ return (a.start+a.wait)<(b.start+b.wait);}int main(){ #ifdef LOCAL freopen("data.in","r",stdin); freopen("data.out","w",stdout); #endif // LOCAL int N; int hh,mm,ss,play,vip; scanf("%d",&N); vector<Person> person; FOR(i,1,N) { scanf("%d:%d:%d %d %d",&hh,&mm,&ss,&pn.play,&pn.vip); if(hh>=21)continue; if(pn.play>=120){ pn.play=120*60; }else{ pn.play=pn.play*60; } pn.start=hh*3600+mm*60+ss; person.push_back(pn); } int m,k; scanf("%d%d",&m,&k); FOR(i,1,k) { int id; scanf("%d",&id); viptab[id]=1; } N=person.size(); sort(person.begin(),person.end(),cmp); FOR(i,1,m) { tm.id=i;tm.endtime=8*3600; qtable[i]=tm; } int num=N; FOR(i,0,N-1) { if(person[i].vip==0){ tm.endtime=oo; FOR(f,1,m) { if(qtable[f].endtime<tm.endtime){ tm=qtable[f]; } } if(tm.endtime<=person[i].start){ table[tm.id]++; person[i].wait=0; qtable[tm.id].endtime=person[i].start+person[i].play; }else{ if(tm.endtime<21*3600){ table[tm.id]++; } if(viptab[tm.id]==0){ person[i].wait=tm.endtime-person[i].start; qtable[tm.id].endtime+=person[i].play; }else{ int cnt=i; while(person[cnt].start<tm.endtime&&cnt<N){ if(person[cnt].vip==1){ break; } cnt++; } if(cnt==N||person[cnt].start>tm.endtime){ person[i].wait=tm.endtime-person[i].start; tm.endtime+=person[i].play; qtable[tm.id]=tm; }else{ pn.start=person[cnt].start; pn.wait=tm.endtime-person[cnt].start; tm.endtime+=person[cnt].play; qtable[tm.id]=tm; person.erase(person.begin()+cnt); person.push_back(pn); i--;N--; } } } }else{ tm.endtime=oo; FOR(f,1,m) { if(person[i].start>=qtable[f].endtime&&viptab[f]){ tm=qtable[f];break; } } if(tm.endtime!=oo){ tm.endtime=person[i].start+person[i].play; table[tm.id]++; person[i].wait=0; qtable[tm.id]=tm; }else{ tm.endtime=oo; FOR(f,1,m) { if(qtable[f].endtime<tm.endtime){ tm=qtable[f]; } } if(tm.endtime<=person[i].start){ table[tm.id]++; person[i].wait=0; qtable[tm.id].endtime=person[i].start+person[i].play; }else{ if(tm.endtime<21*3600){ table[tm.id]++; } person[i].wait=tm.endtime-person[i].start; qtable[tm.id].endtime+=person[i].play; } } } } sort(person.begin(),person.end(),cmpr); for(int i=0;i<num;i++) { if(person[i].start+person[i].wait<21*3600) { int servetime=person[i].start+person[i].wait; if(person[i].wait%60>=30){ person[i].wait=person[i].wait/60+1; }else{ person[i].wait/=60; } printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",person[i].start/3600,person[i].start%3600/60,person[i].start%60,servetime/3600,servetime%3600/60,servetime%60,person[i].wait); }else{ break; } } FOR(i,1,m) { printf("%d",table[i]); if(i<m)printf(" "); } return 0;}
0 0
- PAT 1026. Table Tennis
- 【PAT】1026. Table Tennis
- PAT 1026. Table Tennis (30)
- 1026. Table Tennis (30)-PAT
- PAT 1026. Table Tennis (30)
- PAT 1026. Table Tennis (30)
- pat 1026. Table Tennis (30)
- PAT 1026. Table Tennis (30)
- PAT 1026. Table Tennis (30) 【26/30】
- PAT A 1026. Table Tennis (30)
- PAT 1026. Table Tennis (30)(待修改)
- 【PAT甲级】1026. Table Tennis (30)
- PAT甲级1026. Table Tennis (30)
- 【PAT】【Advanced Level】1026. Table Tennis (30)
- PAT-A-1026. Table Tennis (30)
- PAT 甲级 1026. Table Tennis (30)
- PAT 1026 Table tennis
- PAT 1026 table tennis BONUS1
- Spring MVC中 Json序列化对象实例的问题和两个办法
- 想想玩什么,玩去
- 通过JDBC进行简单的增删改查(以MySQL为例)
- 各种数据库对应的jar包、驱动类名和URL格式
- 一千行MySQL学习笔记【备查】
- 【PAT】1026. Table Tennis
- laravel firstOrCreate后判断是否新增
- VSCode中设置Python解释器和pylint的波浪线问题
- 22nd Feb: 刷题笔记 Binary Tree & Binary Search Tree 专题
- Jupyter的ipynb文件转为python(.py)文件
- 关于Android Studio的gradle sync错误
- StringBuilder > StringBuffer > String
- mysql5.7 修改密码 遇到的问题及解决方法
- C++ 删除字符串中的指定子字符串