首页 > 其他分享 >P1248 加工生产调度

P1248 加工生产调度

时间:2024-04-25 13:23:19浏览次数:26  
标签:node 工序 struct 加工 P1248 安排 调度 int 最小值

link

Solution:

贪心神仙题。

tips: 对于贪心题目,先考虑两个东西时的情况,一般是可以扩展到多个东西的情况的

此时我们考虑两订单 \(i\) 和 \(j\)。

  • 先 \(i\) 后 \(j\) : \(a[i]+\max(b[i],a[j])+b[j]\)

  • 先 \(j\) 后 \(i\) : \(a[j]+\max(b[j],a[i])+b[i]\)

此时我们按这个东西来做 \(\rm cmp\) 就会发现它不对。

为什么呢?

因为这个东西它不具有传递性

如果仔细想想,就会发现按这个排序,对于排完序后下标递增的三个数 \(i,j,k\),他可能不是最优解。说白了,就是这个东西是局部最优解,它不能拓展为全局最优解

(然鹅这个时候我就不会了)

那么我们感性理解一下,越少时间的工序对后面的影响越小。于是我们在两个数组未被安排过的里面找最小值。

找到的最小值可能在 \(a\) 也有可能在 \(b\) ,分讨一下:

1.若最小值是 \(a_i\) ,则此时对于任何一个未被安排的工序 \(j\) ,一定有 \(a_i\le a_j,b_i,b_j\) 。对于上式化简,显然的,应该将 \(i\) 工序安排在 \(j\) 工序前。

2.若最小值是 \(b_i\) ,同理可得,对于任何一个未被安排过得工序 \(j\) 要将 \(j\) 工序安排在 \(i\) 工序前。

那么做法也就一目了然了:

  • 先找到 \(a\) 和 \(b\) 中没有安排过工序中的时间最小值。

  • 若最小值在 \(a\) 数组中,则将此工序安排在未安排工序的首部。

  • 若最小值在 \(b\) 数组中,则将此工序安排在未安排工序的尾部。

  • 求完顺序后模拟一次得到答案

code:

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

const int N=3e4+10;
int order[N],lo,ro;// order 是安排顺序,lo、ro是左端点和右端点
int n,a[N],b[N];
struct node{
	int c,id;// id 为原数组中的编号,c=min(a[i],b[i])
	bool lft;// 是放在首部还是尾部
}rk[N];
bool cmp(struct node n1,struct node n2){
	return n1.c<n2.c;
}

signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>b[i];
	for(int i=1;i<=n;i++){
		rk[i].id=i;rk[i].c=min(a[i],b[i]);
		if(rk[i].c==a[i])rk[i].lft=true;// a[i] 小则放在首部
		else rk[i].lft=false;// 否则就是尾部
	}
	sort(rk+1,rk+n+1,cmp);
	lo=1,ro=n;
	for(int i=1;i<=n;i++){
		if(rk[i].lft)order[lo++]=rk[i].id;
		else order[ro--]=rk[i].id;
	}
	int ta=0,tb=0;// A 厂和 B 厂的最后一工序结束时间
 	for(int i=1;i<=n;i++){
		int x=order[i];
		ta+=a[x];tb=max(ta,tb)+b[x];// 直接模拟
	}
	cout<<max(ta,tb)<<endl;
	for(int i=1;i<=n;i++)cout<<order[i]<<" ";
	
	return 0;
}

标签:node,工序,struct,加工,P1248,安排,调度,int,最小值
From: https://www.cnblogs.com/little-corn/p/18157456

相关文章

  • 什么样的文件传输调度产品 可以简化IT工作流程?
    文件传输调度是企业数据管理中的一个重要环节,企业在存在多个分支机构、子公司,或者多个数据中心、服务器节点的时候,都会需要进行文件传输调度,在使用传统的FTP、rsync等传输方式在应对这些复杂的文件交换需求时,会存在诸多问题及挑战。  1、缺乏自动化策略:无法实现实时自动的数......
  • 告别手动调度,海豚调度器 3.1.x 集群部署让你轻松管理多机!
    转载自第一片心意1前言由于海豚调度器官网的集群部署文档写的较乱,安装过程中需要跳转到很多地方进行操作,所以自己总结了一篇可以直接跟着从头到尾进行操作的文档,以方便后续的部署、升级、新增节点、减少节点的相关操作。2.提前准备2.1.基础组件JDK:下载JDK(1.8+),安装并......
  • AI agent智能体任务分解和调度的几篇经典文章
     ReAct论文解读:LLMReAct范式,在大语言模型中结合推理和动作最近在研究如何让GPT正确做动作,比如搜索内容,发现了《SYNERGIZINGREASONINGANDACTINGINLANGUAGEMODELS》这篇论文。作者提出了ReAct范式,通过将推理和动作相结合来克服LLM胡言乱语的问题,同时提高了结果的可解释性......
  • AI agent中的任务分解和调度-学术界文章汇总
    Reflexion:LanguageAgentswithVerbalReinforcementLearning该文章的要点和关键技术,算法流程该文章提出了一种名为"Reflexion"的新型框架,用于通过语言反馈来强化语言智能体的学习。主要包含以下几个关键点:框架组成:Actor模型:基于大语言模型生成文本和动作E......
  • 车箱调度
    输入有n节车箱,n=0为全部工作结束;再输入A站出车顺序:再输入B站驶入顺序;输出可以调度输出Yes,不可以输出No**样例输入**5123455432151234554123612345654321661234564321650**样例输出**YesNoYesYesCode#de......
  • WhaleScheduler为银行业全信创环境打造统一调度管理平台解决方案
    项目背景数字金融是数字经济的重要支撑和驱动力。近年来,我国针对数字金融的发展政策频频出台,《金融科技发展规划(2022-2025年)》、《“十四五”数字经济发展规划》、《关于银行业保险业数字化转型的指导意见》、《金融标准化“十四五”发展规划》等相继发布,顶层设计逐步完善。2......
  • L2-014 列车调度
    原题链接题解1.后面的列车排到前面最小的比自己大的列车后面code#include<bits/stdc++.h>usingnamespacestd;intlen=0;inta[100005]={0};intmain(){intn;cin>>n;fill(a,a+100005,INT_MAX);for(inti=1;i<=n;i++){intx;......
  • 智能调度_AIRIOT智能车队管理解决方案
    客运、货运、汽车租赁、出租运营等行业对车辆管理、车队管理以及司乘人员的管理方式,逐渐向数字化和智能化转型。传统的依赖人工调度、记录和跟踪的管理模式已经难以满足业务发展需要,存在如下痛点:实时监控与定位功能弱:无法实时获取车辆的位置信息、行驶速度、方向、里程等动态数......
  • 05-智能调度-调度任务
    1.智能调度在神领物流项目中,采用智能调度的方式对车辆任务、快递员的取派件任务进行调度管理,这样更加有效的进行管理,降低企业运营成本。1.1为什么需要调度?可能你会这样的疑问,用户下单了,快递员上门取件,取件后送回网点,网点有车辆运走,再经过车辆的一系列的运输,最后进行派件,对方......
  • 06-智能调度-运输任务
    1.任务调度1.1分析通过前面的实现,已经将相同转运节点的写入到了Redis的队列中,谁来处理呢?这就需要调度任务进行处理了,基本的思路是:查询待分配任务的车辆→计算运力→分配运单→生成运输任务→生成司机作业单也就是说,调度是站在车辆角度推进的。1.2实现这里采......