1 条题解
-
0
C++ :
#include <iostream> #include <algorithm> #include <set> #include <iterator> using namespace std; const int N = 27; int a[N * N], Machine[N][N], Time[N][N], Cur[N], Last[N]; struct Range { int Begin, Last; Range() {Begin = Last = 0;} Range(int a, int b) {Begin = a; Last = b;} friend bool operator < (const Range& a, const Range& b) {return a.Begin < b.Begin;} } c; set<Range> s[N]; set<Range>::iterator I; int main() { int m, n, i, j, Res = 0; cin >> m >> n; for (i = 0; i < m * n; ++i) cin >> a[i]; for (i = 1; i <= n; ++i) for (j = 1; j <= m; ++j) cin >> Machine[i][j]; for (i = 1; i <= n; ++i) for (j = 1; j <= m; ++j) cin >> Time[i][j]; for (i = 1; i <= m; ++i) s[i].insert(Range(0, N * N)); for (i = 0; i < m * n; ++i) { const int& k = a[i]; const int& b = Machine[k][++Cur[k]]; int& l = Last[k]; const int& t = Time[k][Cur[k]]; for (I = s[b].begin(); I != s[b].end(); ++I) if (I -> Begin >= l && I -> Last >= t) { c = *I; s[b].erase(I); l = (c.Begin += t); c.Last -= t; if (c.Last) s[b].insert(c); break; } else if (I -> Begin < l && I -> Begin + I -> Last >= t + l) { c = *I; s[b].erase(I); s[b].insert(Range(c.Begin, l - c.Begin)); c.Last -= l - c.Begin + t; c.Begin = (l += t); s[b].insert(c); break; } } for (i = 1; i <= m; ++i) Res = max(Res, s[i].rbegin() -> Begin); cout << Res << endl; return 0; }
- 1
信息
- ID
- 889
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者