洛谷P1065 [NOIP2006 提高组] 作业调度方案(2022年4月25日第一道普及+/提高)

 这次的代码编写真的是思路很清晰,一开始看到题目真的是一头雾水,然后我将每一步要做的事就行拆解,再将每一步需要的数组或变量一个个添加再实现功能就得出答案了,感觉爽爆了。

#include
#include
using namespace std;
int m, n,order[405];//m为机器数和各个工件的工序数,n为工件数,order为工件安排次序
struct steps//工件的工序所对应机器及加工时间
{
	int gongjian;//步骤对应工件
	int machine;//机器号
	int workpiece;//工序所需加工时间
}comb[405];//comb为组合
struct mach//机器的运作情况
{
	int storage[8100];
}stor[22];
struct gh
{
	int frequency;//出现次数
	int  end_position;//为检测工序进行到前几步的最终位置
}gong[22];//用于检测
void shuru();
bool cmp(gh a, gh b)
{
	return a.end_position > b.end_position;
}
int main()
{
	freopen("title.in", "r", stdin);
	shuru();
	int tem=n*m;
	for (int i = 1; i <=tem; i++)//按顺序进行安排
	{
		int T = 0;
		gong[order[i]].frequency++;
		for (int d = gong[order[i]].end_position+1; d <=8099; d++)
		{
			if (stor[comb[(order[i]-1)*m+gong[order[i]].frequency].machine].storage[d] == 0)
			{
				T++;
				if (T == comb[(order[i] - 1) * m + gong[order[i]].frequency].workpiece)
				{
					for (int g = d - T+1; g<=d; g++)
					{
						stor[comb[(order[i] - 1) * m + gong[order[i]].frequency].machine].storage[g] = 1;//将已占据的位置置为1;
					}
					gong[order[i]].end_position = d;
					break;
				}
			}
			else
				T = 0;
		}
	}
	sort(gong+1, gong+n+1, cmp);
	cout << gong[1].end_position;
}
void shuru()
{
	cin >> m >> n;
	int temp = n * m;
	for (int i = 1; i <= temp; i++)
		cin >> order[i];
	for (int i = 1; i <=temp; i++)
	{
		
		cin >> comb[i].machine;
	}
	for (int i = 1; i <=temp; i++)
		cin >> comb[i].workpiece;
}

你可能感兴趣的:(c++,学习)