zoukankan      html  css  js  c++  java
  • PAT (Advanced Level) 1026. Table Tennis (30)

    情况比较多的模拟题。

    交了50发的样子才AC......AC之后我的天空星星都亮了。

    #include<iostream>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<cstdio>
    #include<map>
    #include<queue>
    #include<vector>
    using namespace std;
    
    struct X
    {
        int st,ml,len;
        bool tag;
    }s[20000+10];
    int n,m,k;
    bool flag[100+10],g[100+10];
    int ans[100+10],w[100+10];
    queue<int>P,V;
    
    bool cmp(const X&a,const X&b) { return a.st<b.st; }
    bool cmp2(const X&a,const X&b) { return a.ml<b.ml; }
    
    void init()
    {
        memset(ans,0,sizeof ans);
        memset(flag,0,sizeof flag);
        for(int i=1;i<=100;i++) w[i]=8*60*60;
    }
    
    void read()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int hh,mm,ss; scanf("%d:%d:%d",&hh,&mm,&ss);
            s[i].st=hh*3600+mm*60+ss;
            scanf("%d",&s[i].len); s[i].len=min(60*s[i].len,2*60*60);
            cin>>s[i].tag;
        }
        scanf("%d%d",&m,&k);
        for(int i=1;i<=k;i++) {int id; cin>>id; flag[id]=1;}
        sort(s+1,s+1+n,cmp);
        s[0].st=999999999;
    }
    
    void work()
    {
        int sz=0,pre=0;
    
        while(1)
        {
            if(sz==n) break;
            int MIN=999999999;
            for(int i=1;i<=m;i++) MIN=min(MIN,w[i]);
    
            for(int i=pre+1;i<=n;i++)
            {
                if(s[i].st>MIN) break;
                if(s[i].tag==0) P.push(i); else V.push(i); pre=i;
            }
    
            memset(g,0,sizeof g);
            for(int i=1;i<=m;i++) if(w[i]==MIN) g[i]=1;
    
            if(P.empty()&&V.empty())
            {
                sz++; pre++;int Find=0;
                if(s[pre].tag==1)
                {
                    for(int i=1;i<=m;i++)
                        if(flag[i]==1&&w[i]<=s[pre].st)
                        {
                            w[i]=s[pre].st+s[pre].len;
                            s[pre].ml=s[pre].st; Find=1;
                            if(s[pre].ml<21*60*60) ans[i]++;
                            break;
                        }
                    if(Find==1) continue;
                    for(int i=1;i<=m;i++)
                        if(flag[i]==0&&w[i]<=s[pre].st)
                        {
                            w[i]=s[pre].st+s[pre].len;
                            s[pre].ml=s[pre].st; Find=1;
                            if(s[pre].ml<21*60*60) ans[i]++;
                            break;
                        }
                }
                else
                {
                    for(int i=1;i<=m;i++)
                        if(w[i]<=s[pre].st)
                        {
                            w[i]=s[pre].st+s[pre].len;
                            s[pre].ml=s[pre].st; Find=1;
                            if(s[pre].ml<21*60*60) ans[i]++;
                            break;
                        }
                }
                continue;
            }
    
            while(!V.empty())
            {
                int fail=1,id=V.front();
                for(int j=1;j<=m;j++)
                    if(flag[j]&&g[j])
                    {
                        sz++;
                        s[id].ml=w[j];
                        w[j]=s[id].ml+s[id].len;
                        fail=0; g[j]=0; V.pop();
                        if(s[id].ml<21*60*60) ans[j]++;
                        break;
                    }
                if(fail==1) break;
            }
    
            while(1)
            {
                int tmp1=0,tmp2=0,id;
                if(P.empty()&&V.empty()) break;
                if(!P.empty()) tmp1=P.front(); if(!V.empty()) tmp2=V.front();
                if(s[tmp1].st<s[tmp2].st) id=tmp1; else id=tmp2;
    
                int fail=1;
                for(int j=1;j<=m;j++)
                    if(g[j])
                    {
                        sz++;
                        s[id].ml=w[j];
                        w[j]=s[id].ml+s[id].len;
                        fail=0; g[j]=0; if(s[id].tag==0) P.pop(); else V.pop();
                        if(s[id].ml<21*60*60) ans[j]++;
                        break;
                    }
                if(fail==1) break;
            }
        }
    }
    
    void prin()
    {
        sort(s+1,s+1+n,cmp2);
        for(int i=1;i<=n;i++)
        {
            if(s[i].ml>=21*60*60) continue;
    
            int fen=(s[i].ml-s[i].st+30)/60;
    
            printf("%02d:",s[i].st/3600); s[i].st=s[i].st-s[i].st/3600*3600;
            printf("%02d:",s[i].st/60); s[i].st=s[i].st-s[i].st/60*60;
            printf("%02d ",s[i].st);
    
            printf("%02d:",s[i].ml/3600); s[i].ml=s[i].ml-s[i].ml/3600*3600;
            printf("%02d:",s[i].ml/60); s[i].ml=s[i].ml-s[i].ml/60*60;
            printf("%02d ",s[i].ml);
    
            printf("%d
    ",fen);
        }
    
        for(int i=1;i<=m;i++)
        {
            printf("%d",ans[i]);
            if(i<m) printf(" ");
            else printf("
    ");
        }
    }
    
    int main()
    {
        init();
        read();
        work();
        prin();
        return 0;
    }
  • 相关阅读:
    疫情环境下的网络学习笔记 python 5.8 数据库入门终章
    疫情环境下的网络学习笔记 python 5.7 navicat数据库,例题,sql注入
    疫情环境下的网络学习笔记 python 5.6 暂时看看
    疫情环境下的网络学习笔记 python 5.5 MYSql 表关系,外键
    疫情环境下的网络学习笔记 python 5.4 数据库基础
    疫情环境下的网络学习笔记 python 4.30 初识数据库
    疫情环境下的网络学习笔记 python 4.29 网络小项目
    XJOI 夏令营501-511测试11 游戏
    XJOI 夏令营501-511测试11 统计方案
    CF1197D Yet Another Subarray Problem
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5507452.html
Copyright © 2011-2022 走看看