//
// 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