1 条题解

  • 0
    @ 2025-4-12 21:41:02

    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
    1082
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者