之前想到的以为要分两个队列 一个用来装等待job,一个用来装时间还没到的
可是后来看了别人的思路,原来只要用flag来标记job工作状态就可以了 http://blog.youkuaiyun.com/glorywu/article/details/3666983
学习了。。。
注意要在f内完成。。。。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define N 10005
struct line
{
int a,b,t,u,v,w,x;
int flag,exucedtime;
}job[N];
int f,m,n,l;
bool compare(struct line a,struct line b)
{
if(a.t<b.t)return 1;
if(a.t==b.t)
if(a.v>b.v)return 1;
return 0;
}
void print(struct line a[],int n)
{
int i;
for(i=0;i<n;i++)
cout<<a[i].a<<" "<<a[i].b<<" "<<a[i].t<<" "<<a[i].u<<" "<<a[i].v<<" "<<a[i].w<<" "<<a[i].x<<endl;
}
void solve()
{
int i,j;
for(i=0;i<=f;i++)
{
for(j=0;j<l;j++)
{
if(job[j].flag==1&&job[j].exucedtime+1==i) //flag: 0 waiting 1 excuting -1 done
{
m+=job[j].a;
n+=job[j].b;
job[j].flag=-1;
}
}
for(j=0;j<l;j++)
{
if(job[j].t>i)break;
if(job[j].flag==0&&job[j].a<=m&&job[j].b<=n&&job[j].t<=i)
{
job[j].flag=1;
m-=job[j].a;
n-=job[j].b;
job[j].exucedtime=i;
}
}
}
}
int main()
{
int i,j,t,value,nn,nm,time,temp,ans=0,flag;
while(cin>>f,f)
{
ans++;
cin>>m>>n>>l;
for(i=0;i<l;i++)
{
cin>>job[i].a>>job[i].b>>job[i].t>>job[i].u>>job[i].v>>job[i].w>>job[i].x;
job[i].flag=0;
}
sort(job,job+l,compare);
/*print(job,l);
*/
solve();
value=0;
for(i=0;i<l;i++)
{
if(job[i].flag==-1)
{
value+=job[i].v;
if(job[i].exucedtime+1<=job[i].u)value+=(job[i].u-job[i].exucedtime-1)*job[i].w;
else
value+=(job[i].u-job[i].exucedtime-1)*job[i].x;
}
if(job[i].flag==0||job[i].flag==1)
{
if(job[i].u<=f)value-=(f-job[i].u)*job[i].x;
}
}
cout<<"Case "<<ans<<": "<<value<<endl<<endl;
}
return 0;
}