Luogu [P1248] 加工生产调度
这个题可以贪心
我们首先想:对于所有产品,我们大致可以将其分为三类:
①.在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[];
int cmp(qwq &a,qwq &b){
if(a.C!=b.C)
return a.C>b.C;
else if(a.C==)
return a.A<b.A;
else if(a.C==-)
return a.B>b.B;
else
return a.A<b.A;
}
inline int read(){
int x=;
char ch=getchar();
while(ch<''||ch>'')
ch=getchar();
while(ch>=''&&ch<=''){
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
return x;
}
int Time_c,cha;
int main(){
n=read();
for(int i=;i<=n;i++)
e[i].A=read(),e[i].id=i;
for(int i=;i<=n;i++){
e[i].B=read();
e[i].C=((e[i].B-e[i].A) >= ? ((e[i].B-e[i].A) > ? : ) : -);//三目运算符给任务分类
}
sort(e+,e+n+,cmp);
for(int i=;i<=n;i++){//模拟
Time_c+=e[i].A;
cha=max(cha-e[i].A,);
cha+=e[i].B;
}
cout<<Time_c+cha<<endl;
for(int i=;i<=n;i++)
printf("%d ",e[i].id);
return ;
}
Luogu [P1248] 加工生产调度的更多相关文章
- 【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山
前提说明,因为我比较菜,关于理论性的证明大部分是搬来其他大佬的,相应地方有注明. 我自己写的部分换颜色来便于区分. 邻项交换对比是求一定条件下的最优排序的思想(个人理解).这部分最近做了一些题,就一起 ...
- 洛谷P1248 加工生产调度
流水作业调度问题 有\(N\)个作业要在两台机器\(M_1\)和\(M_2\)组成的流水线上完成加工.每个作业\(i\)都必须先花时间\(a_i\)在\(M_1\)上加工,然后花时间\(b_i\)在\ ...
- 【题解/模板】P1248 加工生产调度(贪心)
[题解/模板]P1248 加工生产调度(贪心) 分析: \(A\)流水线的时间是确定的,所以现在就是要让\(b\)的时间尽量短 \(tB > tA\),除非所有东西都不需要\(b\).(t指结束 ...
- 洛谷P1248 加工生产调度 贪心
正解:贪心 解题报告: 传送门$QwQ$ $umm$直接看可能比较难想,可以先考虑另一个题? 有$n$个小怪,每打一只小怪会扣$a_i$的血,打完之后会回升$b_i$的血,问至少要多少血量才能使全程血 ...
- 「一本通 1.1 例 4」加工生产调度(贪心算法)(luogu P1248)题解
加工生产调度 题目描述 某工厂收到了 n n n 个产品的订单,这 n n n 个产品分别在 A.B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工. 某个产品 i i i 在 A. ...
- codevs 3008 加工生产调度[贪心]
3008 加工生产调度 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 某工厂收到了n个产品的订 ...
- 加工生产调度(prod)
加工生产调度(prod) 题目描述 有n个部件需在A.B机器上加工,每个工件都必须经过先A后B两道工序. 已知:部件i在A.B机器上的加工时间分别为ai,bi. 问:如何安排n个工件的加工顺序,才能使 ...
- 【洛谷P1248】加工生产调度
题目大意:某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工.某个产品i在A.B两车间加工的时间分别为Ai.Bi.怎样安排这n个产品的加工顺序, ...
- 题解 P1248 【加工生产调度】
题目 某工厂收到了 n 个产品的订单,这 n 个产品分别在 A.B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工. 某个产品 i 在 A.B 两车间加工的时间分别为 Ai,Bi 怎 ...
随机推荐
- oracle 重做日志
原创转载请注明出处 重做日志:记录数据库数据的变化(DDL,DML) 重做日志组:由一个或者多个完全一样的重做日志文件组成,如果一个日志组有多个日志文件,后台进程LGWR会把事务变化写到同一个日志组的 ...
- C#网络编程学习(4)---Socket Tcp进阶之 使用异步循环接收客户端连接和信息
1.方法介绍 BeginAccept(AsyncCallback callback, object state); 异步开始监听客户端连接. callback为一个委托,在成功接收客户端连接时调用委托 ...
- Nacos深入浅出(十)
基本上到第9篇,整个请求的一套就结束了,感觉这里跳跳绕绕很多东西,下面我们来做个总结:从Nacos配置平台修改,到Client请求更新,事件触发去取值返回给客户端,整个过程感觉只分析到了4.5层的深度 ...
- MySQL不同数据库之间表的简单同步
MySQL不同数据库之间表的简单同步,实用轻量级数据如下案列展示:例如我现在主库上面有users .tenants两张表需要同步到备库上面主库1.确认主库数据条数 select count(*) fr ...
- BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...
- 洛谷P3195||bzoj1010 [HNOI2008]玩具装箱TOY
洛谷P3195 bzoj1010 设s数组为C的前缀和 首先$ans_i=min_{j<i}\{ans_j+(i-j-1+s_i-s_j-L)^2\}$ (斜率优化dp)参考(复读)https: ...
- 忘记mysql数据库密码时进行修改方法
长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件夹( ...
- @Import @bean,@Conditional @ConfigurationProperties @EnableConfigurationProperties 注解使用
一分钟学会spring注解之@Import注解http://blog.51cto.com/4247649/2118354 @Autowired与@Resource 注解的使用 https://www. ...
- arch搭建SVN服务器
一.安装 Install the package Install subversion from the official repositories. Create a repository Crea ...
- SQLServer数据库语句大全汇总
目录清单CONTEXT LIST1.数据库DataBase 1.1数据库建立/删除create/drop database 1.2数据库备份与恢复backup/restore database2.数据 ...