ZOJ 1012

题意: 一台计算机:
   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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值