列表

详情


NC13587. 工厂流水线

描述

现代化工厂的生产,讲究流水化作业,只有合理的作业安排,才能保证较高的生产效率。工作人员给出了他们手动安排的机器流水线作业表,但碍于机器数量以及工序较多,人为检验方案是否可行,难度较大,你能否通过编写程序来帮助他们检验呢?
工厂流水线作业机制如下:
工厂生产的产品是由一步步零件不断加工和装配完成的。产品的加工需按照严格的工序进行,即只有一个零件所需的全部组件的上一步工序完成,才能进行下一步工序,且保证上一步的组件只会被下一步中一个零件引用,每台机器同时开始加工,流水线严格按照时序进行,不存在等待情况。
示意图中的黑线代表工序先后关系,样例1情况如下:

样例2情况如下所示,黑×位置的工序关系不成立,故方案不可行。

输入描述

第一行输入一个正整数t(t<=200),代表检验的方案数。随后每组数据第一行,输入一个正整数n(n<=30),代表机器数量。随后n组数据,每组数据第一行输入一个正整数m(m<=30),代表该机器上的加工零件数。随后m组数据,每组数据第一行三个正整数,id(零件在该方案中唯一的id号),time(该项零件加工完成所需的小时数),p(该零件加工需要几个零件),随后p行,每行一个正整数idx,分别代表该零件加工所需的零件id。

输出描述

对于每个方案,若该方案中每组零件都能严格按照流水线机制完成生产,则输出“Yes”,否则输出“No”。

示例1

输入:

2
3
3
1 1 0
2 3 0
3 5 1
4
3
4 3 0
5 3 2
1
7
6 1 1
5
4
7 2 0
8 3 0
9 2 1
2
10 1 0
2
2
1 1 0
2 3 1
3
2
3 2 0
4 2 1
1

输出:

Yes
No

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 264ms, 内存消耗: 4696K, 提交时间: 2022-05-04 23:03:43

t=int(input())
while t:
    gl=[]
    array=[]
    n=int(input())
    while n:
        temp=0
        time=0
        m=int(input())
        while m:
            temp+=time
            id,time,p=map(int,input().split())
            x=[id]
            y=[id]
            y.append(time)
            y.append(temp)
            array.append(y)
            while p:
                add=int(input())
                x.append(add)
                p-=1
            if len(x)>1:
                gl.append(x)
                  
            m-=1

        n-=1
    
    flag=True
    for res in gl:
        fact=array[res[0]-1][2]
        need=0
        for j in range(1,len(res)):
            need+=array[res[j]-1][1]+array[res[j]-1][2]
        if need>fact:
            flag=False
    if flag:
        print('Yes')
    else:
        print('No')
    t-=1

C++(g++ 7.5.0) 解法, 执行用时: 38ms, 内存消耗: 448K, 提交时间: 2022-11-27 18:00:45

#include<bits/stdc++.h>
using namespace std;

int t,n,m,id,p;

struct node{
	int start; //到加工至这个零件所用的时间
	int time; //生产出零件本身所花的时间
	vector<int> need;//生产这个零件所需要的零件
};

int main()
{
	cin>>t;
	while(t--){
		vector<node> s(1000);
		int n;
		cin>>n;
		while(n--){
			int id,p;
			int start = 0;
			int m;
			cin>>m;
			while(m--){
				node temp;
				temp.start =start;
				cin>>id>>temp.time>>p;
				while(p--){
					int idx;
					cin>>idx;
					temp.need.push_back(idx);
				}
				start += temp.time;
				s[id]=temp;
			}
		}
		bool flag = true;
		for(int i=1;i<s.size();i++){
			for(int j=0;j<s[i].need.size();j++){
				int index = s[i].need[j];
				if(s[i].start< s[index].start + s[index].time){
					flag=false;
				}
			}
		}
		if(flag){
			cout<<"Yes"<<endl;
		}else{
			cout<<"No"<<endl;
		}
	}
	return 0;
 } 

C++ 解法, 执行用时: 28ms, 内存消耗: 424K, 提交时间: 2022-03-08 20:41:32

#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
const int N=910;
int hd[N],ne[N*N],idx,to[N*N];
struct node
{
	int s,e;
}a[N];
void add(int u,int v)
{
	idx++;
	to[idx]=v;
	ne[idx]=hd[u];
	hd[u]=idx;
}
bool solve()
{
	idx=0;
	memset(hd,0,sizeof hd);
	int cnt=0;
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int m;
		cin>>m;cnt+=m;
		int now=0;
		for(int j=1;j<=m;j++)
		{
			int id,time,p;
			cin>>id>>time>>p;
			a[id].s=now;
			a[id].e=(now+=time);
			while(p--)
			{
				int v;cin>>v;
				add(id,v);
			}
		}
	}
	for(int u=1;u<=cnt;u++)
	{
		for(int i=hd[u];i;i=ne[i])
		{
			int v=to[i];
			if(a[v].e>a[u].s)return false;
		}
	}
	return true;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		if(solve())puts("Yes");
		else puts("No");
	}
}

C++14(g++5.4) 解法, 执行用时: 25ms, 内存消耗: 988K, 提交时间: 2019-07-22 12:51:30

#include<bits/stdc++.h>
using namespace std;
struct node{
	int start,time;
	vector<int> need;
};
int main()
{
	int T,n,m,id,p,idx,num=0;
	scanf("%d",&T);
	while(T--)
	{
		vector<node>s(905);
		scanf("%d",&n);
		while(n--)
		{
			int start=0;
			scanf("%d",&m);
			while(m--)
			{
				node tmp;
				tmp.start=start;
				scanf("%d%d%d",&id,&tmp.time,&p);
				while(p--)
				{
					scanf("%d",&idx);
					tmp.need.push_back(idx);
				}
				start+=tmp.time;
				s[id]=tmp;
				num++;
			}
		}
		bool flag=1;
		for(int i=1;i<s.size();i++)
		{
			for(int j=0;j<s[i].need.size();j++)
			{
				int index=s[i].need[j];
				if(s[i].start<(s[index].start+s[index].time))
					flag=0;
			}
		}
		if(flag)
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0; 
}

上一题