题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1026
代码如下:
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
struct player{
char arrive[10];
int arrInSec;
int isVIP;
int isPlayed;
int playTime;
bool operator <(const player &A) const{
return arrInSec<A.arrInSec;
}
};
struct table{
int no;
int isVIP;
int sec;
int serverd;
};
vector<player> pla;
vector<table> tab;
int strToSec(char s[]){
return ((s[0]-'0')*10+s[1]-'0')*60*60+((s[3]-'0')*10+s[4]-'0')*60+(s[6]-'0')*10+s[7]-'0';
}
int chooseTab(int n,int time){
int result;
int vmin=0x7fffffff;
for(int i=0;i<n;i++){
if(tab[i].sec<vmin) vmin=tab[i].sec,result=i;
if(tab[i].sec<=time) return i;
}
return result;
}
int chooseTabForVip(int n,int time){
int result;
int vmin=0x7fffffff;
for(int i=0;i<n;i++){
if(tab[i].isVIP&&tab[i].sec<=time) return i;
}
for(int i=0;i<n;i++){
if(tab[i].sec<vmin) vmin=tab[i].sec,result=i;
if(tab[i].isVIP==0&&tab[i].sec<=time) return i;
}
return result;
}
int getW(int s1,int s2){
if(s2>s1){
int second=s2-s1;
int result=second/60;
if(second%60>=30) result++;
return result;
}
else return 0;
}
int main()
{
//freopen("C:\\Users\\Devon\\Desktop\\input.txt","r",stdin);
int np;
scanf("%d",&np);
pla.clear();
tab.clear();
for(int i=0;i<np;i++){
player temp;
scanf("%s",temp.arrive);
temp.arrInSec=strToSec(temp.arrive);
scanf("%d",&temp.playTime);
if(temp.playTime>120) temp.playTime=120;
temp.playTime*=60;
scanf("%d",&temp.isVIP);
temp.isPlayed=0;
pla.push_back(temp);
}
int nt;
int vipt;
scanf("%d%d",&nt,&vipt);
for(int i=1;i<=nt;i++){
table temp;
temp.no=i;
temp.isVIP=0;
temp.serverd=0;
temp.sec=8*60*60;
tab.push_back(temp);
}
for(int i=0;i<vipt;i++){
int temp;
scanf("%d",&temp);
tab[temp-1].isVIP=1;
}
sort(pla.begin(),pla.end());
int closeTime=21*60*60;
int processed=0;
while(processed<np){
for(int i=0;i<np;i++){
if(pla[i].isPlayed==0){
processed++;
if(pla[i].arrInSec>=closeTime){pla[i].isPlayed=1;break;}
int temp;
int k;
if(pla[i].isVIP){
temp=chooseTabForVip(nt,pla[i].arrInSec),k=i;
if(tab[temp].sec>=closeTime){pla[i].isPlayed=1;break;}
}
else{
temp=chooseTab(nt,pla[i].arrInSec);
if(tab[temp].sec>=closeTime){pla[i].isPlayed=1;break;}
int flag=0;
if(tab[temp].isVIP&&tab[temp].sec>pla[i].arrInSec){
for(int j=i+1;j<np;j++){
if(pla[j].isVIP&&pla[j].isPlayed==0&&pla[j].arrInSec<=tab[temp].sec){
flag=1;
k=j;
break;
}
}
}
if(!flag) k=i;
}
if(pla[k].arrInSec>tab[temp].sec) tab[temp].sec=pla[k].arrInSec;
int hour=tab[temp].sec/60/60;
int minute=tab[temp].sec/60%60;
int second=tab[temp].sec%60;
printf("%s %02d:%02d:%02d %d\n",pla[k].arrive,
hour,minute,second,getW(pla[k].arrInSec,tab[temp].sec));
pla[k].isPlayed=1;
tab[temp].sec+=pla[k].playTime;
tab[temp].serverd++;
break;
}
}
}
for(int i=0;i<nt-1;i++) printf("%d ",tab[i].serverd);
printf("%d\n",tab[nt-1].serverd);
return 0;
}