PAT

    xiaoxiao2021-04-18  52

    // // main.cpp // PAT_1026. Table Tennis // // Created by wjq on 17/4/12. // Copyright © 2017年 wjq. All rights reserved. // #include <iostream> #include <string.h> #include <algorithm> #include <vector> using namespace std; struct players { int arrive; int playtime; int vip; int startTime; int playend; }p[100005]; struct table { int id; int vip; int time; int count; }t[105]; int N,K,M; int cmp(players a,players b) { return a.arrive<b.arrive; } int cmptable(table a,table b) { if(a.time==b.time) return a.id<b.id; return a.time<b.time; } int cmpstarttime(players a,players b) { return a.startTime<b.startTime; } int cmptableid(table a,table b) { return a.id<b.id; } void Output(int arriveTime,int startTime) { printf("d:d:d d:d:d %d\n",arriveTime/3600,(arriveTime/60)`,arriveTime`,startTime/3600,(startTime/60)`,startTime`,(startTime-arriveTime+30)/60); } int main(int argc, const char * argv[]) { for(int i=0;i<105;i++) { t[i].id=i; t[i].vip=0; t[i].time=8*60*60; } cin>>N; for(int i=0;i<N;i++) { int HH,MM,SS,time,vip; scanf("%d:%d:%d %d %d",&HH,&MM,&SS,&time,&vip); p[i].arrive=HH*60*60+MM*60+SS; if(time>120) time=120; p[i].playtime=time*60; p[i].vip=vip; p[i].playend=0; } scanf("%d %d",&K,&M); //K个table 从1-K编号 for(int i=0;i<M;i++) //M个vip table { int viptable; scanf("%d",&viptable); t[viptable].vip=1; } sort(p,p+N,cmp); //for(int i=0;i<N;i++) // printf("d:d:d %d\n",p[i].arrive/3600,(p[i].arrive/60)`,p[i].arrive`,p[i].playtime/60); for(int i=0;i<N;) { if(p[i].playend==1) { i++; continue; } sort(t+1,t+K+1,cmptable); //找到最先空闲的id最小的桌子 //考虑 现在t[1]的开放时间是8.00 ,有个人8.01来,有个人8.02来,来的人肯定会占领 //但是如果来的人是vip,那vip会去选空闲的id最小的vip桌子 if(t[1].time<=p[i].arrive) //现在有桌子空闲 { int minVipID=200,minCommonID=200,CommonIndex=-1,VipIndex=-1; //找到空闲桌子中的id最小的桌子.(如果有vip桌子,那就找vip桌子中最小的桌子) for(int j=1;j<=K;j++) { //桌子空闲 && id小 if(t[j].time<=p[i].arrive&&t[j].id<minCommonID) { minCommonID=t[j].id; CommonIndex=j; } //桌子空闲&&id小&&vip桌子 if(t[j].time<=p[i].arrive&&t[j].id<minVipID&&t[j].vip==1) { minVipID=t[j].id; VipIndex=j; } } if(p[i].vip==1&&VipIndex!=-1) //如果来的人是VIP并且有vip桌子 CommonIndex=VipIndex; p[i].startTime=p[i].arrive; t[CommonIndex].time=p[i].arrive+p[i].playtime; if(p[i].startTime<21*60*60) t[CommonIndex].count++; i++; } else if(t[1].time>p[i].arrive&&t[1].vip==1) //现在没有桌子空闲 且最先空出来的桌子是vip桌子 { int privage=false; //标志队伍中是否有人用过特权 for(int j=i;j<N;j++) { if(t[1].time<=p[j].arrive) //到这说明j号人不在排队了 break; if(p[j].vip==1&&p[j].playend==0) { p[j].startTime=t[1].time; t[1].time+=p[j].playtime; if(p[i].startTime<21*60*60) t[1].count++; privage=true; p[j].playend=1; } } if(privage==false) //队伍里没有vip players { p[i].startTime=t[1].time; t[1].time+=p[i].playtime; if(p[i].startTime<21*60*60) t[1].count++; i++; } } else if(t[1].time>p[i].arrive&&t[1].vip==0) //现在没有桌子空闲 且最先空出来的是普通桌子 { p[i].startTime=t[1].time; t[1].time+=p[i].playtime; if(p[i].startTime<21*60*60) t[1].count++; i++; } } sort(p,p+N,cmpstarttime); for(int i=0;i<N;i++) { if(p[i].startTime<21*60*60) Output(p[i].arrive,p[i].startTime); } sort(t+1,t+K+1,cmptableid); cout<<t[1].count; for(int i=2;i<=K;i++) cout<<" "<<t[i].count; return 0; }

    前天晚上模拟了3个小时..最后两个case没过..

    然后这两天一直看一直看,,也没检查出来漏洞所在TAT.

    这题暂时先就这样了.等100道刷完回来再改这道题

    既然没做对,就不说思路了.

    翻篇翻篇.

    转载请注明原文地址: https://ju.6miu.com/read-674815.html

    最新回复(0)