洛谷P1065 [NOIP2006 提高组] 作业调度方案进阶解法

#include
#include

using namespace std;
int m, n, general_sequence[405], cement_machine[20][8001], general_time[25];
struct Item
{
	int abstract_machine[25], abstract_time[25], partial_sequence, partial_time;
}item[25];

int main()
{
	cin >> m >> n;
	for (int i = 0; i < m * n; i++)
		cin >> general_sequence[i];
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> item[i + 1].abstract_machine[j + 1];
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> item[i + 1].abstract_time[j + 1];
	for (int i = 0; i < m * n; i++)
	{
		int start = 0;
		item[general_sequence[i]].partial_sequence++;
		for (start = item[general_sequence[i]].partial_time; ; start++)
		{
			int j;
			for (j = 0; j < item[general_sequence[i]].abstract_time[item[general_sequence[i]].partial_sequence]; j++)
				if (cement_machine[item[general_sequence[i]].abstract_machine[item[general_sequence[i]].partial_sequence]][start + j] != 0)
					goto A;
			break;
		A:;
		}
		for (int j = start; j < start + item[general_sequence[i]].abstract_time[item[general_sequence[i]].partial_sequence]; j++)
			cement_machine[item[general_sequence[i]].abstract_machine[item[general_sequence[i]].partial_sequence]][j] = 1;
		item[general_sequence[i]].partial_time = start + item[general_sequence[i]].abstract_time[item[general_sequence[i]].partial_sequence];
	}
	for (int i = 1; i <= m; i++)
		for (int j = 8000; j >= 0; j--)
			if (cement_machine[i][j] != 0)
			{
				general_time[i] = j;
				break;
			}
	int max_time = 0;
	for (int i = 1; i <= m; i++)
		if (general_time[i] > max_time)
			max_time = general_time[i];
	cout << max_time + 1;
	return 0;
}

你可能感兴趣的:(程序设计代码共享)