PAT 1026 table tennis BONUS1

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");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值