1 条题解
-
0
//0.输入 //1.按照给定安排顺序,找到一个需要插入的工件 //2.找到这个工件,当前需要插入的工序 //3.找到这个工序需要插在哪个机器上 //4.找到这个工序需要花费的时间 //5.找到这个工序,当前能开始的最早的时间 //6.在当前机器上,以最早的时间为起点,从左往右扫,找到一个能放这个工序的空位。 //7.将这个工序放到空位上 //8.将这段时间,标记为在工作 #include<cstdio> #include<iostream> using namespace std; int i,j,k,m,n,ans; int a[405]; //安排顺序 int mord[21][21],t[21][21]; int cnt[21],last_[21]; //last_ 每个工件最晚时间 bool rec[21][8001]; //每台机器的每个时间是否被占用 int main() { scanf("%d%d",&m,&n); for (i=1; i<=m*n; i++) scanf("%d",&a[i]); for (i=1; i<=n; i++) for (j=1; j<=m; j++) scanf("%d",&mord[i][j]); for (i=1; i<=n; i++) for (j=1; j<=m; j++) scanf("%d",&t[i][j]); for (i=1; i<=m*n; i++) { cnt[a[i]]++; int tmp1=a[i],tmp2=cnt[tmp1]; //tmp1:工件 tmp2:工序 int tmpm=mord[tmp1][tmp2]; //机器号 //t[tmp1][tmp2] for (j=last_[tmp1];;j++) { bool flag = 1; for (k=j+1; k<=j+t[tmp1][tmp2]; k++) if (rec[tmpm][k]) { flag = 0; break; } if (flag) { for (k=j+1; k<=j+t[tmp1][tmp2]; k++) rec[tmpm][k] = 1; //扔入空档 last_[tmp1] = max(last_[tmp1],j+t[tmp1][tmp2]); ans = max(ans,last_[tmp1]); //将新覆盖的结束点更新 //printf("%d : %d %d\n",i,j+1,j+t[tmp1][tmp2]); break; } } } printf("%d",ans); return 0; }
- 1
信息
- ID
- 307
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- (无)
- 递交数
- 25
- 已通过
- 20
- 上传者