• ZOJ 1012 Mainframe


      题目大意:有一台主机,有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 }
    View Code
  • 相关阅读:
    第13周学习进度情况
    【Android进阶】获取Android软件的版本信息
    【Android进阶】Android程序与JavaScript之间的简单调用
    字符串长度
    约瑟夫问题
    输入n个数和输出调整后的n个数
    输入三个整数,按由小到大的顺序输出
    学校oj平台上不去
    输入10个整数
    输入三个字符串,按由小到大的顺序输出
  • 原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3257276.html
Copyright © 2020-2023  润新知