822:Queue and A

Queue and A

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;
struct topic{
    int n,st,t,b,w = 0;
}t;
struct person{
    int w = 0,st = 0; //the rest time that can do next work
    int ID,k,tid[maxn];
}p;
struct card{
    int p,tid,t;
}c;
bool operator<(card a,card b){
    return a.t > b.t;
}
int cmp(person a,person b){
    if(a.st != b.st) return a.st < b.st;
    return a.ID < b.ID;
}
int main(){
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    int kase = 0,n;
    while(scanf("%d",&n) && n){
        map<int,topic>reqs;
        vector<int>tids;
        vector<person>sers;
        priority_queue<card>pq;
        int ID,occa = 0,tn = 0;
        while(n--){
            scanf("%d%d%d%d%d",&ID,&t.n,&t.st,&t.t,&t.b);
            tn += t.n;
            tids.push_back(ID);
            reqs[ID] = t;
        }
        scanf("%d",&n);
        while(n--){
            scanf("%d%d",&p.ID,&p.k);
            for(int i = 0;i < p.k;i++) scanf("%d",&p.tid[i]);
            sers.push_back(p);
        }
        int mark = 0;
        while(tn){
            if(mark){
                sort(sers.begin(),sers.end(),cmp);
                mark = 0;
            }
            for(int i = 0;i < sers.size();i++){
                p = sers[i];
                if(p.w) continue;
                int j = 0;
                while(j < p.k && (reqs[p.tid[j]].st > occa || !reqs[p.tid[j]].n || reqs[p.tid[j]].w)) j++;
                if(j == p.k) continue;
                p.st = occa;
                ID = p.tid[j];
                reqs[ID].n--;
                reqs[ID].w = reqs[ID].b;
                p.w = reqs[ID].t;
                c.p = i,c.tid = ID,c.t = occa + p.w;
                pq.push(c);
                //cout<<"push :"<<i<<endl;
            }
            // while(pq.size()){
            //     cout<<pq.top().t<<' ';
            //     pq.pop();
            // }
            // cout<<endl;
            // if(pq.size()){
            //     c = pq.top(); pq.pop();
            //     //cout<<pq.size()<<endl;
            //     while(pq.size() && pq.top().t == c.t){
            //         sers[pq.top().p].w = 0;
            //         pq.pop();
            //     }
            //     int t = sers[c.p].w;
            //     for(int i = 0;i < tids.size();i++){
            //         reqs[tids[i]].w = max(0,reqs[tids[i]].w - t);
            //     }
            //     for(int i = 0;i < sers.size();i++){
            //         sers[i].w = max(0,sers[i].w - t);
            //     }
            //     occa = c.t;
            //     sers[c.p].w = 0;
            //     tn--;
            // }
            // else{
            occa++;
            while(pq.size() && pq.top().t == occa){
                mark = 1;
                sers[pq.top().p].w = 0;
                pq.pop();
                tn--;
            }
            for(int i = 0;i < tids.size();i++){
                reqs[tids[i]].w = max(0,reqs[tids[i]].w - 1);
            }
            for(int i = 0;i < sers.size();i++){
                sers[i].w = max(0,sers[i].w - 1);
            }

            //cout<<occa<<endl;
        }
        cout<<"Scenario "<<++kase<<": All requests are serviced within "<<occa<<" minutes.\n";
    }
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000 + 5;
struct topic{
    int n,st,t,b,w = 0;
}t;
struct person{
    int w = 0,st = 0; //the rest time that can do next work
    int ID,k,tid[maxn];
}p;
struct card{
    int p,tid,t;
}c;
bool operator<(card a,card b){
    return a.t > b.t;
}
int cmp(person a,person b){
    if(a.st != b.st) return a.st < b.st;
    return a.ID < b.ID;
}
int main(){
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    int kase = 0,n;
    while(scanf("%d",&n) && n){
        map<int,topic>reqs;
        vector<int>tids;
        vector<person>sers;
        priority_queue<card>pq;
        int ID,occa = 0,tn = 0;
        while(n--){
            scanf("%d%d%d%d%d",&ID,&t.n,&t.st,&t.t,&t.b);
            tn += t.n;
            tids.push_back(ID);
            reqs[ID] = t;
        }
        scanf("%d",&n);
        while(n--){
            scanf("%d%d",&p.ID,&p.k);
            for(int i = 0;i < p.k;i++) scanf("%d",&p.tid[i]);
            sers.push_back(p);
        }
        while(tn){
            sort(sers.begin(),sers.end(),cmp);
            for(int i = 0;i < sers.size();i++){
                p = sers[i];
                if(p.w) continue;
                int j = 0;
                while(j < p.k && (reqs[p.tid[j]].st > occa || !reqs[p.tid[j]].n || reqs[p.tid[j]].w)) j++;
                if(j == p.k) continue;
                p.st = occa;
                ID = p.tid[j];
                reqs[ID].n--;
                reqs[ID].w = reqs[ID].b;
                p.w = reqs[ID].t;
                c.p = i,c.tid = ID,c.t = occa + p.w;
                pq.push(c);
                //cout<<"push :"<<i<<endl;
            }
            if(pq.size()){
                c = pq.top(); pq.pop();
                //cout<<pq.size()<<endl;
                while(pq.size() && pq.top().t == c.t){
                    tn--;
                    sers[pq.top().p].w = 0;
                    pq.pop();
                }
                int t = sers[c.p].w;
                for(int i = 0;i < tids.size();i++){
                    reqs[tids[i]].w = max(0,reqs[tids[i]].w - t);
                }
                for(int i = 0;i < sers.size();i++){
                    sers[i].w = max(0,sers[i].w - t);
                }
                occa = c.t;
                sers[c.p].w = 0;
                tn--;
            }
            else{
                occa++;
                for(int i = 0;i < tids.size();i++){
                    reqs[tids[i]].w = max(0,reqs[tids[i]].w - 1);
                }
                for(int i = 0;i < sers.size();i++){
                    sers[i].w = max(0,sers[i].w - 1);
                }
            }
            //cout<<occa<<endl;
        }
        cout<<"Scenario "<<++kase<<": All requests are serviced within "<<occa<<" minutes.\n";
    }
    return 0;
}


posted @ 2018-04-30 23:50  ACLJW  阅读(141)  评论(0编辑  收藏  举报