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;
    }
  • 相关阅读:
    八大排序
    如何在VirtualBox虚拟机软件上安装Win7虚拟系统
    Android 的网络编程
    Android设计模式-观察者模式
    java开发之——[接口回调]
    MVC,MVP设计模式
    [Android四大组件之二]——Service
    [Android四大组件之一]——Activity
    Android中Context详解
    [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5507452.html
Copyright © 2011-2022 走看看