代码如下:
#include<bits/stdc++.h>
using namespace std;
struct jiqi {
string sjz; // 定义每个机器的时间轴(用string方便查找连续的"0")
} jq[20];
struct gongjian {
int gongxu,jsz; // 定义工序与上一工序结束时刻(其实是下一工序开始时刻)
int gxdyjq[20],gxsj[20]; // 定义每个工序对应的机器与每个工序所需时间
} gj[20];
int turn[400],jqs,gjs; // 定义安排顺序、机器数和工件数
string zero[19]={"0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000"};
int main() {
for (int i=0;i<20;i++) {
for (int j=1;j<=8000;j++) {
jq[i].sjz+="0";
}
} // 将每个机器时间轴设置为0
cin >> jqs >> gjs;
for (int i=0;i<jqs*gjs;i++) {
cin >> turn[i];
}
for (int i=0;i<gjs;i++) {
for (int j=0;j<jqs;j++) {
cin >> gj[i].gxdyjq[j];
}
}
for (int i=0;i<gjs;i++) {
for (int j=0;j<jqs;j++) {
cin >> gj[i].gxsj[j];
}
}
for (int i=0;i<jqs*gjs;i++) {
gj[turn[i]-1].gongxu++; // 进入下一工序
int s=jq[gj[turn[i]-1].gxdyjq[gj[turn[i]-1].gongxu-1]-1].sjz.find(zero[gj[turn[i]-1].gxsj[gj[turn[i]-1].gongxu-1]-1],gj[turn[i]-1].jsz); // 查找机器中符合工序的空余时间
for (int j=s;j<=s+gj[turn[i]-1].gxsj[gj[turn[i]-1].gongxu-1]-1;j++) {
jq[gj[turn[i]-1].gxdyjq[gj[turn[i]-1].gongxu-1]-1].sjz[j]='1'; // 将用过的时间设为1
gj[turn[i]-1].jsz=s+gj[turn[i]-1].gxsj[gj[turn[i]-1].gongxu-1]; // 更新结束值
}
}
int max=0;
for (int i=0;i<jqs;i++) {
// cout << jq[i].sjz << endl; // 调试时间轴
for (int j=jqs*gjs*20-1;j>=0;j--) {
if (jq[i].sjz[j]=='1' && j>max) max=j;
}
}
cout << max+1; // 求总用时
return 0;
}
输出:380 正确答案:7200 (另一个问题:当设时间轴长度为800(粗心qwq)时50分,subtask1输出7220(虽然也是错的),是什么情况?) 真心发问!求各位巨佬帮帮蒟蒻吧!!!