这题向我说明了读题目的重要性
这题题目有一个坑点 1 1 2 3 3 2
比如说这组样例 工件1 一定要在 第一道工序中是最先开始的,
然后 1也一定要在第二组工序中最先开始的
但是,工件3的第一道工序却可以先于 1 的第二道工序完成
因为只是相同工序中首先完成
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 #include <iomanip> 7 #include <iostream> 8 using namespace std ; 9 10 int i,j,k,m,n,tmp1,tmp2,tmpm,ans ; 11 int what[21][21],t[21][21],a[411],cnt[21],last_[21] ; 12 bool rec[21][8001] ; 13 14 int main() 15 { 16 scanf("%d%d",&m,&n) ; 17 for(i=1;i<=n*m;i++) scanf("%d",&a[ i ]) ; 18 for(i=1;i<=n;i++) 19 for(j=1;j<=m;j++) 20 scanf("%d",&what[ i ][ j ]) ; 21 for(i=1;i<=n;i++) 22 for(j=1;j<=m;j++) 23 scanf("%d",&t[ i ][ j ]) ; 24 for(i=1;i<=n*m;i++) 25 { 26 cnt[a[ i ]]++ ; 27 int tmp1 = a[ i ],tmp2 = cnt[ a[i] ] ; // tmp1 哪个工件 tmp2 哪个工序 28 int tmpm = what[ tmp1 ][ tmp2 ] ; //用哪个机器 29 for(j=last_[tmp1];;j++) 30 { 31 bool flag = 1 ; 32 for(k=j+1; k<=j+t[tmp1][tmp2] ;k++) 33 if(rec[tmpm][k]) 34 { 35 flag = 0 ; 36 break ; 37 } 38 if(flag) 39 { 40 for(k=j+1; k<=j+t[tmp1][tmp2]; k++ ) 41 rec[tmpm][k] = 1 ; 42 last_[tmp1] = max(last_[tmp1],j+t[tmp1][tmp2]) ; 43 ans = max(ans,last_[tmp1] ) ; 44 break ; 45 } 46 } 47 } 48 printf("%d\n",ans) ; 49 50 return 0 ; 51 }