标签:车间 P1248 Luogu 调度 放在 int return include qwq
这个题可以贪心
我们首先想:对于所有产品,我们大致可以将其分为三类:
①.在A车间的时间要比B车间长。
②.两者一样。
③.在B车间的时间要比A车间长。
对于这三大类,怎么安排顺序?
可以看出,①类是消耗B车间任务,③类是给B车间增加任务。
我们想,要想时间最快,必须要尽可能的让AB两车间没有空闲的工作。如果我们将①放在了开头,而③放在了结尾,那必然会导致开始时B工作的时间断断续续,最后等A工作完了,B还剩下一大堆任务。
所以我们要尽可能的将③放在开始,①放在结尾,②安排在中间就可以(没有什么影响)。
三大类排好顺序后,我们再想每一类内部之间的顺序:
对于①:放在结尾执行,到最后必然A全部执行完毕,B还剩一点没执行(因为A最后执行的产品刚刚归入B类),那我们此时所消耗的时间就是最后产品的B车间时间,当然是越小越好,所以③类要按照B从大到小排。
对于②:好像既然放在了中间,就无所谓了。
对于③:同①理,放在开始执行,一开始必然第一个任务执行A时,B此时空着,那我们此时所消耗的时间就是开始产品的A车间时间,当然是越小越好,所以①类要按照A从小到大排。
然后从头到尾模拟一遍就行了。
代码:
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int n; struct qwq{ int A; int B; int C;//看看这个零件属于哪一类 int id;//此零件下标 }e[1005]; int cmp(qwq &a,qwq &b){ if(a.C!=b.C) return a.C>b.C; else if(a.C==1) return a.A<b.A; else if(a.C==-1) return a.B>b.B; else return a.A<b.A; } inline int read(){ int x=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x; } int Time_c,cha; int main(){ n=read(); for(int i=1;i<=n;i++) e[i].A=read(),e[i].id=i; for(int i=1;i<=n;i++){ e[i].B=read(); e[i].C=((e[i].B-e[i].A) >= 0 ? ((e[i].B-e[i].A) > 0 ? 1 : 0) : -1);//三目运算符给任务分类 } sort(e+1,e+n+1,cmp); for(int i=1;i<=n;i++){//模拟 Time_c+=e[i].A; cha=max(cha-e[i].A,0); cha+=e[i].B; } cout<<Time_c+cha<<endl; for(int i=1;i<=n;i++) printf("%d ",e[i].id); return 0; }
标签:车间,P1248,Luogu,调度,放在,int,return,include,qwq 来源: https://www.cnblogs.com/qiuchengrui/p/11018728.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。