NC13587. 工厂流水线
描述
输入描述
第一行输入一个正整数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; }