题目大意:有一台主机,有m个cpu和n的内存,有l个任务,每个任务需消耗一定的cpu和内存,给出任务的开始时间和截止时间,完成任务可获得一定的金钱,同时提前完成有奖金,延后完成要扣钱。计算到某个时间所得收入。
首先按照任务的开始时间和价值进行排序,然后就是模拟题目描述的过程了。

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 #define MAXN 10000+10 6 7 struct Job 8 { 9 int a, b; 10 int t, u; 11 int v, w, x; 12 bool operator < (const Job& x) const 13 { 14 if (t != x.t) return t < x.t; 15 else return v > x.v; 16 } 17 }; 18 Job jobs[MAXN]; 19 bool finish[MAXN]; 20 21 int main() 22 { 23 #ifdef LOCAL 24 freopen("in", "r", stdin); 25 #endif 26 int F, M, N, L; 27 int kase = 0; 28 while (scanf("%d", &F) != EOF && F) 29 { 30 scanf("%d%d%d", &M, &N, &L); 31 for (int i = 0; i < L; i++) 32 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); 33 sort(jobs, jobs+L); 34 memset(finish, 0, sizeof(finish)); 35 int income = 0; 36 for (int i = 0; i < F; i++) 37 { 38 int cpu = M, mem = N; 39 for (int j = 0; j < L; j++) 40 { 41 if (jobs[j].t > i) break; 42 if (!finish[j] && cpu >= jobs[j].a && mem >= jobs[j].b) 43 { 44 cpu -= jobs[j].a; 45 mem -= jobs[j].b; 46 finish[j] = true; 47 income += jobs[j].v; 48 int t = i + 1; // the finished time 49 if (t < jobs[j].u) income += jobs[j].w * (jobs[j].u-t); 50 if (t > jobs[j].u) income -= jobs[j].x * (t-jobs[j].u); 51 } 52 } 53 } 54 for (int i = 0; i < L; i++) 55 if (!finish[i] && jobs[i].u <= F) 56 income -= jobs[i].x * (F - jobs[i].u); 57 printf("Case %d: %d ", ++kase, income); 58 } 59 return 0; 60 }