You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
4.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <bits/stdc++.h>
using namespace std;
const int N = 20 + 10; //m<20,n<20,范围是20以内开大一点防止出错
//本题不吸氧可以过10个点第11个点TLE。吸氧后可以能完全部11个点。
//用来记录题目输入的数据信息
int n, m; //m表示机器数n表示工件数
int seq[N * N]; //为给定的安排顺序。大小为m*n所以开了一个N*N的数组。是安排顺序的简写形式。
int p[N][N]; //工件+工序的机器号
int t[N][N]; //工件+工序的执行时长
const int M = N * N * 100; //时长最长情况的上限比如n个工件全都安排在1号机器上制作共m个工序每个工序时长为1000,咋也够了吧?
int res[N][M]; //这是每台机器的时长安排情况,记录每台机器上每个时间点是哪个工件在制作
//获取第i个位置的数据是seq[i]这台机器的第几次出现?
int getProcessNum(int i) {
int x = seq[i];
int cnt = 0;
for (int j = 0; j <= i; j++)if (seq[j] == x) cnt++;
return cnt;
}
//获取工件x的最后制作时间
int getLastTime(int x) {
int lastTime = 0;
for (int i = 1; i <= m; i++)// 遍历所有机器
for (int j = M - 1; j >= 0; j--)
if (res[i][j] == x) {
lastTime = max(lastTime, j + 1);//找出最大值,就是最后的制作时间
break;
}
return lastTime;
}
/**
* 功能:检查函数
* @param start 从哪个时间开始
* @param len 需要多长的时间
* @param mac 哪台机器上进行检查
* @return 是不是能放得下去
*/
bool check(int start, int len, int mac) {
for (int i = start; i < start + len; i++)
if (res[mac][i])return false; //在这个范围内如果有使用的情况就返回false, 表示放不下去
//全部通过表示可以放的下去返回true
return true;
}
int main() {
//m机器数n工件数
//示例数据2 3表示2台机器3个工件
cin >> m >> n;
//给定的安排顺序,示例数据:1 1 2 3 3 2描述第一个物品第一个工序第一个物品第二个工序第二个物品第一个工序第三个物品第一个工序第三个物品第二个工序第二个物品第二个工序
for (int i = 1; i <= n * m; i++) cin >> seq[i];
/**
前n行依次表示每个工件的每个工序所使用的机器号第1个数为第1个工序的机器号第2个数为第2个工序机器号等等。
1 2 第一件物品第1个工序需要在1号机器上进行第2个工序需要在2号机器上进行
1 2 第二件物品第1个工序需要在1号机器上进行第2个工序需要在2号机器上进行
2 1 第三件物品第1个工序需要在2号机器上进行第2个工序需要在1号机器上进行
*/
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> p[i][j];
//每个工件的每个工序的加工时间
//后n行依次表示每个工件的每个工序的加工时间。
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> t[i][j];
//处理每一个输入顺序
for (int i = 1; i <= n * m; i++) {
int x = seq[i]; //第几个工件
int y = getProcessNum(i); //此工件的第几个工序(第几次出现就是第几个工序)
int mac = p[x][y]; //根据工件+工件的工序--->第几个机器上加工
for (int j = getLastTime(x);; j++) { //此工件需要在最后一次加工时间的基础上去尝试符合规则1,直到找到答案为止
//看看有空的话能不能放的下去比如有3个空但不够长就不行
if (check(j, t[x][y], mac)) {
//标识此位置被占用
for (int k = j; k < j + t[x][y]; k++)res[mac][k] = x;
break;
}
}
}
//找到最长的时间是哪个
int ans = 0;
for (int i = 1; i <= n; i++)ans = max(ans, getLastTime(i));
cout << ans << endl;
return 0;
}