PAT Advanced Level 1030

来源:互联网 发布:怎么学python 编辑:程序博客网 时间:2024/05/16 05:05

题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1030

代码如下:

#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;}


0 0
原创粉丝点击