#include <stdio.h>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 10005
struct Job{
int A, B, T, U, V, W, X;
bool operator < (const Job & J) const{
if(T != J.T) return T < J.T;//按到达时间小的在前
else return V > J.V; //若到达时间相同,则报酬大的在前
}
};
Job jobs[MAXN];
bool finished[MAXN];
int main(){
int F, M, N, L;
int icase = 0;
while(scanf("%d", &F) && F){
scanf("%d%d%d", &M, &N, &L);
for(int i = 0; i < L; i++){//输入作业表
scanf("%d%d%d%d%d%d%d", &jobs[i].A, &jobs[i].B, &jobs[i].T, &jobs[i].U, &jobs[i].V, &jobs[i].W, &jobs[i].X);
}
sort(jobs, jobs+L);//作业排序
memset(finished, 0, sizeof(finished));//用数组表示挂起的作业
int income = 0;
for(int i = 0; i < F; i++){
int cpu = M, mem = N;
for(int j = 0; j <L; j++){
if(jobs[j].T > i) break;
if(!finished[j] && cpu >= jobs[j].A && mem >= jobs[j].B){
cpu -= jobs[j].A;
mem -= jobs[j].B;
finished[j] = true;
income += jobs[j].V;
int t = i + 1;
if(t < jobs[j].U) income += jobs[j].W * (jobs[j].U - t); //提前完成,加奖
if(t > jobs[j].U) income -= jobs[j].X * (t - jobs[j].U); //迟到完成,惩罚
}
}
}
for(int i = 0; i < L; i++){//挂起的作业处理,若结束时间晚于终止时间且没有执行的工作不计算惩罚
if(!finished[i] && jobs[i].U <= F){// 结束时间早于终止时间的没有执行的工作,计算惩罚到终止时间
income -= jobs[i].X * (F - jobs[i].U);
}
}
printf("Case %d: %d\n\n", ++icase, income);
}
return 0;
}
ZOJ-1012-mainframe
最新推荐文章于 2021-10-08 09:32:50 发布