洛谷P1065 作业调度方案(#9测试点未果)
eg:
#include<iostream>
#include<cstdio>
#include<string.h>
int x[10000]; //记录加工步骤
int order[30][30]; //记录每个物品的工序顺序
int cost[30][30]; //记录每个物品响应工序花费的时间
int work[30][10000]; //记录每个机器的加工过程
int used[30]; //记录对应物品第几次加工
int tim[30]; //统计每行最大长度
int last[30]; //记录每件物品最后一次出现的地方,该物品下一次加工在其后
int mt; //答案,最长加工时间
int doing[30][10000]; //记录该物品在当前时间 是否由其他机器加工
using namespace std;
//进行筛查记录
void check(int a, int t, int y) {
if(last[y]==0)
last[y]=1;
for (int i = last[y];i < 10000;i++) {
if (work[a][i] == 0 && doing[y][i] == 0) {
int pd = 0;
for (int j = i + 1;j < i + t;j++)
{
if (work[a][j] != 0 || doing[y][j] == 1) {
pd = 1;
break;
}
}
if (pd == 0) {
for (int j = i;j < i + t;j++) {
work[a][j] = y;
doing[y][j] = 1;
}
if (tim[a] < (i + t - 1))
{
tim[a] = i + t - 1;
last[y]=tim[a];
}
break;
}
}
}
}
int main() {
int m, n;
cin >> m >> n;
//输入处理顺序
for (int i = 1;i <= m * n;i++) {
cin >> x[i];
}
//输入同种工件处理的工序顺序
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
cin >> order[i][j];
}
}
//输入各个工件对应工序所花时间
for (int i = 1;i <= n;i++) {
for (int j = 1;j <= m;j++) {
cin >> cost[i][j];
}
}
for (int i = 1;i <= m * n;i++) {
used[x[i]]++; //当前处理工件工序
check(order[x[i]][used[x[i]]], cost[x[i]][used[x[i]]], x[i]);
}
//比较各个机器中所花最长时间,即为答案
for (int i = 1;i <= m;i++) {
if (mt < tim[i])
mt = tim[i];
}
cout << mt;
return 0;
}