zoj 1012Mainframe

47 篇文章 0 订阅

之前想到的以为要分两个队列 一个用来装等待job,一个用来装时间还没到的

可是后来看了别人的思路,原来只要用flag来标记job工作状态就可以了  http://blog.csdn.net/glorywu/article/details/3666983

学习了。。。

注意要在f内完成。。。。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define N 10005
struct line
{
	int a,b,t,u,v,w,x;
	int flag,exucedtime;
}job[N];
int f,m,n,l;
bool compare(struct line a,struct line b)
{
	if(a.t<b.t)return 1;
	if(a.t==b.t)
		if(a.v>b.v)return 1;
	return 0;
}
void print(struct line a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		cout<<a[i].a<<" "<<a[i].b<<" "<<a[i].t<<" "<<a[i].u<<" "<<a[i].v<<" "<<a[i].w<<" "<<a[i].x<<endl;
	
}
void solve()
{
	int i,j;
	for(i=0;i<=f;i++)
	{
		for(j=0;j<l;j++)
		{
			if(job[j].flag==1&&job[j].exucedtime+1==i)  //flag: 0 waiting 1 excuting -1 done
			{
				m+=job[j].a;
				n+=job[j].b;
				job[j].flag=-1;
			}
		
		}
		for(j=0;j<l;j++)
		{
			if(job[j].t>i)break;
			if(job[j].flag==0&&job[j].a<=m&&job[j].b<=n&&job[j].t<=i)
			{
				job[j].flag=1;
				m-=job[j].a;
				n-=job[j].b;
				job[j].exucedtime=i;
			}
		}
	}

}
int main()
{
	int i,j,t,value,nn,nm,time,temp,ans=0,flag;
	while(cin>>f,f)
	{
		ans++;
		cin>>m>>n>>l;
		for(i=0;i<l;i++)
		{
			cin>>job[i].a>>job[i].b>>job[i].t>>job[i].u>>job[i].v>>job[i].w>>job[i].x;
			job[i].flag=0;
		}
		sort(job,job+l,compare);
		/*print(job,l);
		*/
		solve();
		value=0;
		for(i=0;i<l;i++)
		{
			if(job[i].flag==-1)
			{
				value+=job[i].v;
				if(job[i].exucedtime+1<=job[i].u)value+=(job[i].u-job[i].exucedtime-1)*job[i].w;
				else
					value+=(job[i].u-job[i].exucedtime-1)*job[i].x;
			}
			if(job[i].flag==0||job[i].flag==1)
			{
				if(job[i].u<=f)value-=(f-job[i].u)*job[i].x;
			}
		}
		cout<<"Case "<<ans<<": "<<value<<endl<<endl;
	}
	return 0;


}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值