Source:
PAT 1026
http://pat.zju.edu.cn/contests/pat-a-practise/1026
Analysis:
这个坑点很多吧... 但是依靠神奇的全模拟完美的避开了好几个坑点
Answer:
#include <cstdio>
#include <string.h>
#include <algorithm>
#define MAXN 10010
#define MAXM 101
#define BEGTIME 28800
#define ENDTIME 75600
#define file_io() freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)
using namespace std;
//Struct Definition
struct Node{
int arriveTime;
int playTime;
int isVip;
int startTime;
};
//Sort Compare
int cmp_arri(Node a,Node b) {return a.arriveTime < b.arriveTime;}
int cmp_star(Node a,Node b) {return a.startTime < b.startTime;}
//
int N=MAXN,M=MAXM,beginTime=BEGTIME,endTime=ENDTIME;
int num[MAXM],use[MAXM],vip[MAXM];
int n,k,m;
int norNext = 0, vipNext = 0, useNum = 0, vipNum = 0;
int vn = 0, pn = 0, cnt = 0;
Node p[MAXN],vp[MAXN],np[MAXN];//p->plaeyr,vp->vip player,np->normal player
//Function Definitions
void core_init();
void core_calc();
void calc_sync();
void calc_assignVip(int t);
void calc_assignNormal(int t);
void core_fini();
//
int main() {
//file_io();
core_init();
core_calc();
core_fini();
}
void core_init() {
scanf("%d",&n);
for (int i=0;i<n;i++) {
int hour,min,sec;
scanf("%d:%d:%d %d %d",&hour,&min,&sec,&p[i].playTime,&p[i].isVip);
p[i].arriveTime=hour*3600 + min*60 + sec;
if (p[i].playTime>120) p[i].playTime=120;//no longer than 2 hours
p[i].playTime*=60;
}
scanf("%d %d",&k,&m);//k tables which include M vip tables
for (int i=0;i<m;i++) {
int v;
scanf("%d",&v);
vip[v]=1;
}
sort(p,p+n,cmp_arri);//sort by arrive time
for (int i=0;i<n;i++) {
if(p[i].isVip==1) vp[vn++]=p[i];
else np[pn++]=p[i];
}
vp[vn].arriveTime=endTime;
np[pn].arriveTime=endTime;//set an end for the array
}
void core_calc() {
//simulate the time
for (int t=beginTime;t<endTime;t++) {
calc_sync();
calc_assignVip(t);
calc_assignNormal(t);
}
}
void calc_sync() {
for (int i = 1;i <= k;i++){
if(use[i]){
use[i]--;//one seconds past, click~
if(use[i]==0){//one playey is going to leave
if(vip[i]) vipNum--;
useNum--;
}
}
}
}
void calc_assignVip(int t) {
while (vp[vipNext].arriveTime<=t&&vipNum<m) {
vp[vipNext].startTime=t;
for (int i=1;i<=k;i++)
if (vip[i]&&!use[i]) {
use[i]=vp[vipNext].playTime;
num[i]++;
break;
}
vipNum++,useNum++,vipNext++;
}
}
void calc_assignNormal(int t) {
while((np[norNext].arriveTime<=t||vp[vipNext].arriveTime<=t)&&useNum<k) {
int i;
for (i=1;i<=k;i++)
if(!use[i]) break;
if (np[norNext].arriveTime<vp[vipNext].arriveTime) {
np[norNext].startTime=t;
use[i]=np[norNext++].playTime;
}
else {
vp[vipNext].startTime = t;
use[i] = vp[vipNext++].playTime;
}
if (vip[i]) vipNum++;
useNum++,num[i]++;
}
}
void core_fini() {
for (int i=0;i<vn;i++)
p[cnt++]=vp[i];
for (int i=0;i<pn;i++)
p[cnt++]=np[i];
sort(p,p+cnt,cmp_star);
//output
for (int i=0;i<cnt;i++){
if (p[i].startTime==0) continue;
printf("%02d:%02d:%02d ",p[i].arriveTime/3600,(p[i].arriveTime%3600)/60,p[i].arriveTime%60);
printf("%02d:%02d:%02d ",p[i].startTime/3600,(p[i].startTime%3600)/60,p[i].startTime%60);
printf("%d\n",(30 + p[i].startTime - p[i].arriveTime)/60);
}
printf("%d",num[1]);
for (int i=2;i<=k;i++)
printf(" %d",num[i]);
printf("\n");
}