30pts纯暴力模拟。输出总是比答案小一点,T了2个(有很多用于调试的注释代码)
查看原帖
30pts纯暴力模拟。输出总是比答案小一点,T了2个(有很多用于调试的注释代码)
992529
upto_300楼主2023/9/9 10:28
#include<bits/stdc++.h>
#define go(a,it,b) for(int it=a;it<=b;it++)
using namespace std;
int n,m,k=1,plan[401],t[21][21],M[21][21],go[21],remain[21],pro[21];
//t[i][j]:  工件i阶段j加工需要的时间
//M[i][j]:  工件i阶段j加工需要的机器
//go[i]:    工件i现在的加工进度
//remain[i]:机器i加工好现在的工件还要的时间
//pro[i]:   机器i正在加工的工件 
bool did[401];
void process(int x){
    int i=k;
    int id=plan[i];
    while(M[id][go[id]]!=x&&i<=m*n){
        i++,id=plan[i];
    }
    if(i==k)k++;
    if(i>m*n)return;
	plan[i]=0,remain[x]=t[id][go[id]],pro[x]=id;
//	cout<<"  ";
//	go(1,i,m*n)cout<<plan[i]<<' ';
//	cout<<endl;
//	cout<<"  "<<x<<"加工"<<id<<" for "<<remain[x]<<endl; 
}
bool end(){
	go(1,i,m)if(remain[i])return 0;
	return 1;
}
int main(){
	cin>>m>>n;
	go(1,i,n*m)cin>>plan[i];
	go(1,i,n)go(1,j,m)cin>>M[i][j];
	go(1,i,n)go(1,j,m)cin>>t[i][j];
	go(1,i,n)go[i]=1;
	go(1,cost,1e9){
//		cout<<cost<<'\n'; 
		go(1,i,m){
			if(remain[i]==1)go[pro[i]]++;
			if(remain[i])remain[i]--;
			if(!remain[i])process(i);
		}
//		cout<<"  remain: ";
//		go(1,i,m)cout<<remain[i]<<' ';
//		cout<<"\n  go: ";
//		go(1,i,n)cout<<go[i]<<' ';
//		cout<<endl;
		if(end()){cout<<cost-1;return 0;} 
	}
}
2023/9/9 10:28
加载中...