洛谷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;
  }
posted @ 2020-08-21 17:10  Auterman  阅读(246)  评论(0编辑  收藏  举报