浙大PAT甲级 1026
来源:互联网 发布:kindle免费阅读软件 编辑:程序博客网 时间:2024/04/29 08:19
这个题目模拟队列,需要考虑的条件很多,在此列出:
(1)vip的顾客优先考虑vip桌子,如果没有空vip桌子则考虑普通桌。
(2)普通客户也可以占vip桌子,当有多个桌子空则选择编号最小的桌。
(3)客户占用桌子时间不能超过2小时,超过则按2小时计算。
(4)如果在21点之前没有能够占到桌子,则不予考虑。
(5)注意等待时间四舍五入。
AC代码:
#include<iostream>#include<vector>#include<map>#include<cstdio>#include<algorithm>using namespace std;struct node{ int id; int arr_xiaoshi; int arr_fen; int arr_miao; int vip; int deal_time; int ser_xiaoshi=8; int ser_fen=0; int ser_miao=0; int fin_xiaoshi; int fin_fen; int fin_miao;};int vip[105];int num[105];bool cmp(node x,node y){ if(x.arr_xiaoshi!=y.arr_xiaoshi) return x.arr_xiaoshi<y.arr_xiaoshi; else { if(x.arr_fen!=y.arr_fen) return x.arr_fen<y.arr_fen; else { return x.arr_miao<y.arr_miao; } }}bool cmp1(node x,node y){ if(x.fin_xiaoshi!=y.fin_xiaoshi) return x.fin_xiaoshi<y.fin_xiaoshi; else { if(x.fin_fen!=y.fin_fen) return x.fin_fen<y.fin_fen; else { if(x.fin_miao!=y.fin_miao) return x.fin_miao<y.fin_miao; else return x.id<y.id; } }}bool cmp2(node x,node y){ if(x.fin_xiaoshi!=y.fin_xiaoshi) return x.fin_xiaoshi<y.fin_xiaoshi; else { if(x.fin_fen!=y.fin_fen) return x.fin_fen<y.fin_fen; else { if(x.fin_miao!=y.fin_miao) { return x.fin_miao<y.fin_miao; } else { if(x.vip!=y.vip) return x.vip>y.vip; else return x.id<y.id; } } }}bool cmp3(node x,node y){ if(x.ser_xiaoshi!=y.ser_xiaoshi) return x.ser_xiaoshi<y.ser_xiaoshi; else { if(x.ser_fen!=y.ser_fen) return x.ser_fen<y.ser_fen; else { //if(x.ser_miao!=y.ser_miao) return x.ser_miao<y.ser_miao; /* else return x.vip>y.vip;*/ } }}bool f(node x,node y){ if(x.arr_xiaoshi<y.arr_xiaoshi) return true; else if(x.arr_xiaoshi>y.arr_xiaoshi) return false; else { if(x.arr_fen<y.arr_fen) return true; else if(x.arr_fen>y.arr_fen) return false; else { if(x.arr_miao<y.arr_miao) return true; else return false; } }}bool ff(node x,node y){ if(x.arr_xiaoshi<y.fin_xiaoshi) return true; else if(x.arr_xiaoshi>y.fin_xiaoshi) return false; else { if(x.arr_fen<y.fin_fen) return true; else if(x.arr_fen>y.fin_fen) return false; else { if(x.arr_miao<y.fin_miao) return true; else return false; } }}void cal_fin(node &x){ if(x.deal_time>=120) { x.fin_xiaoshi=x.ser_xiaoshi+2; x.fin_fen=x.ser_fen; x.fin_miao=x.ser_miao; } else { x.fin_fen=(x.ser_fen+x.deal_time)%60; x.fin_xiaoshi=x.ser_xiaoshi+(x.ser_fen+x.deal_time)/60; x.fin_miao=x.ser_miao; }}int main(){ int n; cin>>n; vector<node> ord; vector<node> vipp; map<int,vector<node> > m_ord; map<int,vector<node> > m_vip; vector<node> all; for(int i=0;i<n;i++) { node tmp; scanf("%d:%d:%d",&tmp.arr_xiaoshi,&tmp.arr_fen,&tmp.arr_miao); cin>>tmp.deal_time>>tmp.vip; if(tmp.vip==1) vipp.push_back(tmp); else ord.push_back(tmp); } int k,m; cin>>k>>m; for(int i=0;i<m;i++) { int d; cin>>d; vip[d]=1; vector<node> v; m_vip.insert(pair<int,vector<node> >(d,v)); } for(int i=1;i<=k;i++) { if(vip[i]==0) { vector<node> v; m_ord.insert(pair<int,vector<node> >(i,v)); } } sort(ord.begin(),ord.end(),cmp); sort(vipp.begin(),vipp.end(),cmp); int it1=ord.size(); int it2=vipp.size(); int ll=0,rr=0; while(ll!=it1||rr!=it2) { node tmp; if(ll>=it1&&rr<it2) { tmp=vipp[rr]; } else if(ll<it1&&rr>=it2) { tmp=ord[ll]; } else if(ll<it1&&rr<it2) { tmp=f(ord[ll],vipp[rr])==true?ord[ll]:vipp[rr]; } else if(ll>=it1&&rr>=it2) { break; } map<int,vector<node> >::iterator itt; for(itt=m_ord.begin();itt!=m_ord.end();itt++) { if(itt->second.empty()) continue; if(ff(tmp,itt->second.front())==false) { itt->second.erase(itt->second.begin()); } } for(itt=m_vip.begin();itt!=m_vip.end();itt++) { if(itt->second.empty()) continue; if(ff(tmp,itt->second.front())==false) { itt->second.erase(itt->second.begin()); } } if(tmp.vip==0) //最早到是普通客户 { map<int,vector<node> >::iterator it; int flag=0; for(int i=1;i<=k;i++) { if(vip[i]==1) { if(m_vip[i].empty()) { tmp.id=i; if(tmp.arr_xiaoshi*3600+tmp.arr_fen*60+tmp.arr_miao>=8*3600) {tmp.ser_xiaoshi=tmp.arr_xiaoshi; tmp.ser_fen=tmp.arr_fen; tmp.ser_miao=tmp.arr_miao;} cal_fin(tmp); num[i]++; m_vip[i].push_back(tmp); flag=1; ll++; break; } } else { if(m_ord[i].empty()) { tmp.id=i; if(tmp.arr_xiaoshi*3600+tmp.arr_fen*60+tmp.arr_miao>=8*3600) {tmp.ser_xiaoshi=tmp.arr_xiaoshi; tmp.ser_fen=tmp.arr_fen; tmp.ser_miao=tmp.arr_miao;} cal_fin(tmp); num[i]++; m_ord[i].push_back(tmp); flag=1; ll++; break; } } } if(flag==0) { node tt[105]; int shu=0; for(it=m_ord.begin();it!=m_ord.end();it++) { tt[shu++]=it->second.front(); } for(it=m_vip.begin();it!=m_vip.end();it++) { tt[shu++]=it->second.front(); } sort(tt,tt+shu,cmp1); node tmp1=tt[0]; int haoma=tmp1.id; if(vip[haoma]==0) { m_ord[haoma].erase(m_ord[haoma].begin()); tmp.ser_xiaoshi=tmp1.fin_xiaoshi; tmp.ser_fen=tmp1.fin_fen; tmp.ser_miao=tmp1.fin_miao; tmp.id=haoma; cal_fin(tmp); m_ord[haoma].push_back(tmp); num[haoma]++; ll++; } else { m_vip[haoma].erase(m_vip[haoma].begin()); if(tmp.vip==0) { if(rr<it2) { if(ff(vipp[rr],tmp1)) { tmp=vipp[rr]; tmp.ser_xiaoshi=tmp1.fin_xiaoshi; tmp.ser_fen=tmp1.fin_fen; tmp.ser_miao=tmp1.fin_miao; rr++; } else { tmp.ser_xiaoshi=tmp1.fin_xiaoshi; tmp.ser_fen=tmp1.fin_fen; tmp.ser_miao=tmp1.fin_miao; ll++; } cal_fin(tmp); tmp.id=haoma; m_vip[haoma].push_back(tmp); num[haoma]++; } else { tmp.ser_xiaoshi=tmp1.fin_xiaoshi; tmp.ser_fen=tmp1.fin_fen; tmp.ser_miao=tmp1.fin_miao; cal_fin(tmp); tmp.id=haoma; cal_fin(tmp); m_vip[haoma].push_back(tmp); num[haoma]++; ll++; } } else { tmp.ser_xiaoshi=tmp1.fin_xiaoshi; tmp.ser_fen=tmp1.fin_fen; tmp.ser_miao=tmp1.fin_miao; cal_fin(tmp); tmp.id=haoma; cal_fin(tmp); m_vip[haoma].push_back(tmp); num[haoma]++; rr++; } } } } else //最早到是vip客户 { map<int,vector<node> >::iterator it; int flag=0; for(it=m_vip.begin();it!=m_vip.end();it++) { if(it->second.empty()) { if(tmp.arr_xiaoshi*3600+tmp.arr_fen*60+tmp.arr_miao>=8*3600) {tmp.ser_xiaoshi=tmp.arr_xiaoshi; tmp.ser_fen=tmp.arr_fen; tmp.ser_miao=tmp.arr_miao;} tmp.id=it->first; cal_fin(tmp); m_vip[tmp.id].push_back(tmp); num[tmp.id]++; flag=1; rr++; break; } } if(flag==0) { for(it=m_ord.begin();it!=m_ord.end();it++) { if(it->second.empty()) { if(tmp.arr_xiaoshi*3600+tmp.arr_fen*60+tmp.arr_miao>=8*3600) {tmp.ser_xiaoshi=tmp.arr_xiaoshi; tmp.ser_fen=tmp.arr_fen; tmp.ser_miao=tmp.arr_miao;} tmp.id=it->first; cal_fin(tmp); m_ord[tmp.id].push_back(tmp); num[tmp.id]++; flag=1; rr++; break; } } } if(flag==0) { node tt[105]; int shu=0; for(it=m_vip.begin();it!=m_vip.end();it++) { tt[shu++]=it->second.front(); //cout<<tt[shu-1].fin_xiaoshi<<" "<<tt[shu-1].fin_fen<<" "<<tt[shu-1].fin_miao<<endl; } for(it=m_ord.begin();it!=m_ord.end();it++) { tt[shu++]=it->second.front(); //cout<<tt[shu-1].fin_xiaoshi<<" "<<tt[shu-1].fin_fen<<" "<<tt[shu-1].fin_miao<<endl; } sort(tt,tt+shu,cmp2); node tmp1=tt[0]; //cout<<tmp1.id<<endl; int haoma=tmp1.id; tmp.ser_xiaoshi=tmp1.fin_xiaoshi; tmp.ser_fen=tmp1.fin_fen; tmp.ser_miao=tmp1.fin_miao; tmp.id=haoma; num[haoma]++; rr++; cal_fin(tmp); if(vip[haoma]==1) { m_vip[haoma].erase(m_vip[haoma].begin()); m_vip[haoma].push_back(tmp); } else { m_ord[haoma].erase(m_ord[haoma].begin()); m_ord[haoma].push_back(tmp); } } } all.push_back(tmp); } sort(all.begin(),all.end(),cmp3); for(int i=0;i<all.size();i++) { if(all[i].ser_xiaoshi>=21) { num[all[i].id]--; continue; } else { printf("%02d:%02d:%02d ",all[i].arr_xiaoshi,all[i].arr_fen,all[i].arr_miao); printf("%02d:%02d:%02d ",all[i].ser_xiaoshi,all[i].ser_fen,all[i].ser_miao); int time1=all[i].ser_xiaoshi*3600+all[i].ser_fen*60+all[i].ser_miao; int time2=all[i].arr_xiaoshi*3600+all[i].arr_fen*60+all[i].arr_miao; double ww=((time1-time2)*1.0+30)/60; printf("%d\n",(int)(ww)); } } cout<<num[1]; for(int i=2;i<=k;i++) { cout<<" "<<num[i]; }}
0 0
- 浙大PAT甲级 1026
- 浙大pat甲级 1023
- 浙大pat甲级 1024
- 浙大pat甲级 1025
- 浙大PAT甲级 1028
- 浙大PAT甲级 1029
- 浙大PAT甲级 1030
- 浙大PAT甲级 1031
- 浙大PAT甲级 1032
- 浙大PAT甲级 1033
- 浙大PAT甲级 1035
- 浙大PAT甲级 1037
- 浙大PAT甲级 1039
- 浙大PAT甲级 1040
- 浙大PAT甲级 1038
- 浙大PAT甲级 1041
- 浙大PAT甲级 1042
- * 浙大PAT甲级 1043
- POI操作EXCEL之导出Excel
- leetcode-java-377. Combination Sum IV
- 51nod1030 大数进制转换
- 浅谈https\ssl\数字证书
- ACM报错指南
- 浙大PAT甲级 1026
- Oracle dbLink详解
- 欢迎使用CSDN-markdown编辑器
- 转:eclipse 调用堆栈 快捷键
- scatter plots smooth算法 lowess
- PullToRefreshListView嵌套ViewPager冲突导致的界面不显示
- Andriod解决键盘覆盖输入框的问题
- 中软java学习8月12日笔记
- “循环引用”