100分求助!!Subtask #1 过不去!
查看原帖
100分求助!!Subtask #1 过不去!
494699
卷王慢即快楼主2022/5/27 18:45

怎么会输出7220?

#include<iostream>
using namespace std;
int worklist[500],worknumber[30][30],worktime[30][30]; //输入数组  
int stepcnt[30],ans[30]; bool timepoint[500][500];     //辅助数组 
int m,n; //输入变量 
inline bool check(int begin,int end,int work) /*起始时间点,最终时间点,工作序号 */ 
{ //进入函数 
	for(int time=begin;time<=end;time++) //扫描时间点 
		if(timepoint[work][time]!=0) //若该时间点被占用 
			return 0; //该时间段不符合条件,退出。 
	return 1; //若可以,返回1。 
}
inline void input() //输入函数,使程序整洁。 
{
	cin>>m>>n;
	for(int i=1;i<=m*n;i++) cin>>worklist[i]; //输入顺序 
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
	cin>>worknumber[i][j]; //输入机器号 
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
	cin>>worktime[i][j];   //输入每个工序每个机器号所对应的用时 
}
int main()
{
	input(); //调用函数 
	for(int i=1;i<=n*m;i++) //本代码核心部分 
	{
		int tmp=worklist[i]; //赋值,一步一步来 
		stepcnt[tmp]++; //该工序将被执行,工序数+1。 
		int nnum=worknumber[tmp][stepcnt[tmp]], //记录机器号 
		     ntime=worktime[tmp][stepcnt[tmp]]; //记录用时 
		for(int time=ans[tmp]+1; ;time++) //时间段遍历 
			if(check(time,time+ntime-1,nnum)==1) //若时间段符合要求 
			{
			for(int j=time;j<time+ntime;j++)
				timepoint[nnum][j]=1; //将时间点标记 
			ans[tmp]=time+ntime-1;
			break; //找到的第一个时间段一定是最优的。 
			}
	}
	int a=0;
	for(int i=1;i<=n;i++) a=max(a,ans[i]);  //取用时最多的时间 
	cout<<a; //输出 
	return 0;
}

提交记录

2022/5/27 18:45
加载中...