USACO Training 4.2.3 Job Processing 工序安排 题解与分析

2024-06-07 07:18

本文主要是介绍USACO Training 4.2.3 Job Processing 工序安排 题解与分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Job Processing 工序安排

IOI'96


描述

一家工厂的流水线正在生产一种产品,这需要两种操作:操作A和操作B。每个操作只有一些机器能够完成。

Ioi96d1.gif

上图显示了按照下述方式工作的流水线的组织形式。A型机器从输入库接受工件,对其施加操作A,得到的中间产品存放在缓冲库。B型机器从缓冲库接受中间产品,对其施加操作B,得到的最终产品存放在输出库。所有的机器平行并且独立地工作,每个库的容量没有限制。每台机器的工作效率可能不同,一台机器完成一次操作需要一定的时间。

给出每台机器完成一次操作的时间,计算完成A操作的时间总和的最小值,和完成B操作的时间总和的最小值。

格式

PROGRAM NAME: job

INPUT FORMAT:

(file job.in)

第一行 三个用空格分开的整数:N,工件数量 (1<=N<=1000);M1,A型机器的数量 (1<=M1<=30);M2,B型机器的数量 (1<=M2<=30)。

第二行…等 M1个整数(表示A型机器完成一次操作的时间,1..20),接着是M2个整数(B型机器完成一次操作的时间,1..20)

OUTPUT FORMAT:

(file job.out)

只有一行。输出两个整数:完成所有A操作的时间总和的最小值,和完成所有B操作的时间总和的最小值(A操作必须在B操作之前完成)。

SAMPLE INPUT

5 2 3
1 1 3 1 4

SAMPLE OUTPUT

3 5
【分析】:
    这道题用二分答案+贪心.
    首先对于A工序的总耗时二分一个答案x,然后验证这个时间是否合不合理:既不多,又不少.那么在这一段时间内可作出的工件数为∑x/time[i],1≤i≤M1,对该值进行判断即可.比较难想的是B工序的总耗时,首先算出完成一个工件的A工序后的时间点time1,如样例中A机器1 1,那么在时间ans1=3内这两台机器完成一个工件的时间分别为1,1,2,2,3,3,即表示:1时间点出1个工件<由A1机器制造>,1时间点出1个工件<由A2机器制造>,2时间点出1个工件<由A1机器制造>,2时间点出1个工件<由A2机器制造>,3时间点出1个工件<由A1机器制造>,3时间点出1个工件<由A2机器制造>.                              
    然后开始B工序的二分答案,如第一问二分方法,我们需检查二分出的数x是否满足条件.相应的,我们处理出所有完成一个工件的B工序后的时间点time2[i],那么x-time2[i]就是对于当前时间而言最晚开始B工序的时间点.类似的,我们将time2排序,筛出N个最小的time2,这样使得整体开始B工序的时间尽可能晚<若这里改为筛出N个最大的,那么这个二分永远找不出解,仔细想想>.
    最后判断是否对应的每个time1都小于等于time2,若不是就说明这种方案不行,应当继续二分
 
【代码】:
/*
ID:csyzcyj1
PROG:job
LANG:C++
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
#define MAXM 31
#define MAX 20001
#define IMAX 2147483647
int N,M1,M2,ans1=IMAX,ans2=IMAX,min1=IMAX,min2=IMAX,pos1[MAX],pos2[MAX],tot=0;
int a[MAXM],b[MAXM];
bool cmp(int x,int y){return x>y;}
bool check1(int x)
{
int now=0;
for(int i=1;i<=M1;i++)
now+=x/a[i];
if(now>=N)   return true;
else return false;
}
bool check2(int x)
{
int sum=0;
memset(pos2,0,sizeof(pos2));
for(int i=1;i<=M2;i++)
for(int j=1;j<=x/b[i];j++)
if(x-j*b[i]>0)   
pos2[++sum]=j*b[i];//算出完成一个工件的B工序后的时间点
if(sum<N)   return false;
sort(pos2+1,pos2+1+sum);
for(int i=1;i<=N;i++)
if(pos1[i]>x-pos2[i])//x-pos2[i]表示最晚开始B工序的时间 
return false;
return true;         
}
void work()
{
int left=1,right=min1*N;
while(left<=right)//二分完成A操作的总耗时 
{
int middle=(left+right)/2;
if(check1(middle))
right=middle-1;
else  left=middle+1;
}
ans1=left;
for(int i=1;i<=M1;i++)
for(int j=1;j<=ans1/a[i];j++)
pos1[++tot]=j*a[i];//算出完成一个工件的A工序后的时间点
sort(pos1+1,pos1+1+tot,cmp);
for(int i=1;i<=N;i++)
pos1[i]=pos1[i+tot-N];//筛出最小的N个时间 
left=ans1,right=ans1+min2*N;//二分完成B操作的总耗时 
while(left<=right)
{
int middle=(left+right)/2;
if(check2(middle))
right=middle-1;
else  left=middle+1;
}
ans2=left;
}
int main()
{
freopen("job.in","r",stdin);
freopen("job.out","w",stdout); 
scanf("%d%d%d",&N,&M1,&M2);
for(int i=1;i<=M1;i++)
{
scanf("%d",&a[i]);
min1=min(min1,a[i]);
}
for(int i=1;i<=M2;i++)
{
scanf("%d",&b[i]);
min2=min(min2,b[i]);
}
work();
printf("%d %d\n",ans1,ans2);
//system("pause");
return 0;
}
【评测信息】:
      Compiling...
      Compile: OK
      Executing...
      Test 1: TEST OK [0.000 secs, 3536 KB]
      Test 2: TEST OK [0.000 secs, 3536 KB]
      Test 3: TEST OK [0.000 secs, 3536 KB]
      Test 4: TEST OK [0.000 secs, 3536 KB]
      Test 5: TEST OK [0.000 secs, 3536 KB]
      Test 6: TEST OK [0.000 secs, 3536 KB]
      Test 7: TEST OK [0.000 secs, 3536 KB]
      Test 8: TEST OK [0.000 secs, 3536 KB] 
      Test 9: TEST OK [0.000 secs, 3536 KB]
      Test 10: TEST OK [0.011 secs, 3536 KB]
      Test 11: TEST OK [0.011 secs, 3536 KB]
      Test 12: TEST OK [0.011 secs, 3536 KB]
      All tests OK.
 

转载注明出处:http://blog.csdn.net/u011400953

这篇关于USACO Training 4.2.3 Job Processing 工序安排 题解与分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038501

相关文章

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File