模拟:作业调度方案

P1065 [NOIP2006 提高组] 作业调度方案

思路:

显然,是在每个机器的时间轴是操作,那我们试着模拟每个机器的时间轴,通过对时间轴数组的标记与操作(这个时间有加工标记时间为1,没有标记为0,从而进行筛选

#include <bits/stdc++.h>
using namespace std;
#define ll     long long
const int INF = 0x3f3f3f3f;
const int N = 500;

struct node
{
	int jq, t;
} arr[N][N]; //arr[i][j]表示第i工件第j步骤的所在机器jq与时间t

bool tline[30][10000000];//tline[i][]表示机器i的时间轴,时间轴尽量开长一点
int lasttime[30];//表示上一次工件加工的最后时间
int xu[N];//记录给定序列
int now[30];//表示工件目前加工到第几步
int main()
{
	int n, m;
	cin >> m >> n;
	for (int i = 1; i <= n * m; ++i)cin >> xu[i];
	for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j)cin >> arr[i][j].jq;
	for (int i = 1; i <= n; ++i)for (int j = 1; j <= m; ++j)cin >> arr[i][j].t;
	for (int i = 1; i <= m * n; ++i)
		{
			int x = xu[i];//x为工件
			int y = ++now[x];//y为步骤
			int s = 0;
			int jq = arr[x][y].jq;
			int t = arr[x][y].t;
			                           //这个时间没有上限
			for (int j = lasttime[x] + 1;  ; ++j)//每次从上一次这个工件加工的时间开始
				{
					if (!tline[jq][j])//遍历该机器的时间轴,直到找到可以容纳t长度的时间
						{
							s++;
						}
					else s = 0;//每次中断,都要重新开始
					if (s == t)
						{
							lasttime[x] = j;//找到后,把这段时间全部标记为找到,然后就跳出
							for (int k = j - t + 1; k <= j; ++k)tline[jq][k] = 1;
							break;
						}
				}
		}
	int h = -1;
	for (int i = 1; i <= n; ++i)h = max(h, lasttime[i]);//找最长的时间轴(不是到机器m,而是每个工件的时间轴(共n个))
	cout << h << endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值