PAT Advanced Level 1026

题目地址: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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值