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