题意:
一台计算机:
1)有M个cpu,N个内存
2)存在一个足够大的工作队列
3)一个工作JobJi需要Ai个cpu和Bi个内存,到达队列的时间为Ti,
完成截止时间为Ui,完成后的奖励为Vi。提早完成,额外奖励Wi
每小时。延迟完成,处罚Xi每小时。
4)当一个工作在执行的时候,所使用的cpu和内存不能再分配给其它
的工作,直到该工作计算完成。
5)每个工作的执行时间为1小时。
6)没有其它工作需要执行的时候,空闲,直到有新的工作到达队列。
7)如果有多个工作的到达时间相同,总是先检测价值高的工作,
可以认为每个工作的价值都不相同。
8)工作到达时间早的先检测。
收入计算:截止时间大于f且还没执行的工作不予考虑。
截止时间小于等于f的工作,完成的收入为工作的价值加上相关的
奖励或者处罚,没执行完成的只计算处罚。
-------------------------------------------以上是copy别人的------------------------
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
using namespace std;
struct job{
int st,en,cpu,mem,v,w,x;
bool operator<(const job t)const
{
return st<t.st||(st==t.st&&v>t.v);
}
void get()
{
scanf("%d%d%d%d%d%d%d",&cpu,&mem,&st,&en,&v,&w,&x);
}
} jb[10009];
bool visit[10009];
int cpu[100009],mem[10009],val[10009];
int F,M,C,L;
int main()
{
freopen("in.txt","r",stdin);
int T = 1;
while(~scanf("%d",&F)&&F)
{
scanf("%d%d%d",&C,&M,&L);
for(int i=0;i<L;i++) jb[i].get();
memset(visit,0,sizeof(visit));
memset(cpu,0,sizeof(cpu));
memset(mem,0,sizeof(mem));
memset(val,0,sizeof(val));
sort(jb,jb+L);
int ans = 0 ;
for(int i=0;i<F;i++)
{
C+=cpu[i];M+=mem[i];
cpu[i] = mem[i] = 0;
int ch = -1;
for(int j=0;j<L&&jb[j].st<=i;j++)
{
if(jb[j].cpu<=C&&jb[j].mem<=M&&!visit[j])
{
ch = j;
break;
}
}
if(ch!=-1)
{
visit[ch] = 1;
C-=jb[ch].cpu;
M-=jb[ch].mem;
mem[1+i]+=jb[ch].mem;
cpu[1+i]+=jb[ch].cpu;
int tmp= 0 ;
if(1+i<jb[ch].en) tmp = (jb[ch].en-1-i)*jb[ch].w;
else tmp = (jb[ch].en-1-i)*jb[ch].x;
val[1+i]+=jb[ch].v+tmp;
i--;
}
}
for(int i=0;i<=F;i++) ans+=val[i] ;
for(int i=0;i<L;i++) if(!visit[i]&&jb[i].en<F) ans-= (F-jb[i].en)*jb[i].x;
printf("Case %d: %d\n\n",T++,ans);
}
return 0;
}