USACO4.2.3-Job Processing

chunlvxiong的博客


题目描述:

  有N(1≤N≤1000)件产品,每个产品生产需要操作A和操作B。有M1(1≤M1≤30)件机器完成操作A,M2(1≤M2≤30)件机器完成操作B,分别给出每台机器完成相应操作的时间。产品必须先进行操作A再进行操作B,问:所有产品完成操作A的时间和所有产品完成操作B的时间是多少。

思考&分析:

  第一问比较好解决,可以贪心处理。假设第i台机器加工了xi件产品,那么所有产品完成操作A的时间就是max{xi*time_a[i]}。由于每次必须有一个xi+1,那么你的贪心策略就是让(xi+1)*time_a[i]最小(也就是让这次的产品完成时间最小)。这里你可以使用堆来维护(xi+1)*time_a[i](详见代码),同时你每次也可以算出每个产品完成操作A的时间(是一个非递减序列)。

  第二问很明显要借用第一问的计算结果(每个产品的完成时间)。设产品i完成操作A的时间是ti,然后我们考虑:

  

  这两个图是说:交换时间段对于问题的答案无影响。-->这有什么用呢?例如:忽略4号工件,那么3号工件结束时间是t[3]+time_b,2号工件结束时间是t[2]+time_b*2,1号工件结束时间为t[1]+time_b*3-->一个简单想法:对于完成操作A的时间第i靠后的工件x,其结束时间为t[x]+time_b*i。

  那么如果加入了4号工件呢?三号工件的完成时间变成了t[3]+time_b*2,然而实际上它的完成时间是t[3]*time_b-->但是这并没有关系,因为t[3]+time_b*2不可能超过t[4]+time_b,不影响最大值(如果t[3]+time_b*2大于t[4]+time_b说明最大时间是t[3]+time_b*2)。也就是说,刚才那个简单想法是行的通的。

  这样问题就变得容易很多:贪心策略可以为每次让最后完成操作A的工件放到(xi+1)*time_b[i]最小的机器上(由于其t值大,所以要减小这个值以避免max过大)。那么这个维护又变成了第一问的堆维护,但要注意这次的序列不在具有非递减的性质,需要取max来获得ans。

  总时间复杂度O(NlogM)。

贴代码:

#include <bits/stdc++.h>
using namespace std;
int n,m1,m2,a[35],b[35],end_a[1005];
struct node{
    int x,y;
    friend bool operator <(node a,node b){
        return a.x>b.x;
    }
};
priority_queue<node>Q;
void solve1(){
    sort(a+1,a+m1+1);
    for (int i=1;i<=m1;i++)
        Q.push(node{a[i],i});
    for (int i=1,x,y;i<=n;i++){
        x=Q.top().x,y=Q.top().y;
        Q.pop();
        end_a[i]=x;
        Q.push(node{x+a[y],y});
    }
    printf("%d ",end_a[n]);
    while (!Q.empty()) Q.pop();
}
void solve2(){
    sort(b+1,b+m2+1);
    for (int i=1;i<=m2;i++)
        Q.push(node{b[i],i});
    int ans=0;
    for (int i=n,x,y;i>=1;i--){
        x=Q.top().x,y=Q.top().y;
        Q.pop();
        ans=max(ans,end_a[i]+x);
        Q.push(node{x+b[y],y});
    }
    printf("%d\n",ans);
}
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]);
    for (int i=1;i<=m2;i++) scanf("%d",&b[i]);
    solve1();
    solve2();
    return 0;
}
时间: 2024-12-28 06:17:21

USACO4.2.3-Job Processing的相关文章

洛谷P2751 [USACO4.2]工序安排Job Processing

P2751 [USACO4.2]工序安排Job Processing 18通过 78提交 题目提供者该用户不存在 标签 难度普及+/提高 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 一家工厂的流水线正在生产一种产品,这需要两种操作:操作A和操作B.每个操作只有一些机器能够完成. Ioi96d1.gif 上图显示了按照下述方式工作的流水线的组织形式.A型机器从输入库接受工件,对其施加操作A,得到的中间产品存放在缓冲库.B型机器从缓冲库接受中间产品,对其施加操作B,得到的最终产品存放在输

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

Multithreading Batch Processing Framework

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # Author: f0rsaken 4 5 import argparse 6 import importlib 7 import sys 8 import threadpool 9 import time 10 11 def main(): 12 parser = argparse.ArgumentParser(description="Multithreading Batch Proce

SNC processing failed_SAProuter_证书重新生成

文章为原创,转载请联系我,欢迎交流[email protected] 参照note 1178684 - No service connection: "SNC processing failed" 确认证书所在位置 Execute the following commands on your SAProuter machine: sapgenpse seclogin -l sapgenpse get_my_name -n validity 在cmd直接运行报错 利用everything

洛谷P2738 [USACO4.1]篱笆回路Fence Loops

P2738 [USACO4.1]篱笆回路Fence Loops 11通过 21提交 题目提供者该用户不存在 标签USACO 难度提高+/省选- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 农夫布朗的牧场上的篱笆已经失去控制了.它们分成了1~200英尺长的线段.只有在线段的端点处才能连接两个线段,有时给定的一个端点上会有两个以上的篱笆.结果篱笆形成了一张网分割了布朗的牧场.布朗想将牧场恢复原样,出于这个考虑,他首先得知道牧场上哪一块区域的周长最小. 布朗将他的每段篱笆从1到N进行了标号

DirectX Video Processing AppWizard--CDxVideoGraphBase

http://www.ifp.illinois.edu/~chenyq/research/Utils/DxVideoAppWiz/DxVideoAppWiz.html 一个非常棒的DirectX Video Processing AppWizard,备忘.

转: rdlc报表An error occurred during local report processing错误

在开发环境的电脑上可生成报表,但是一到客户端就提示An error occurred during local report processing错误. 猜想是缺dll,补充上 Microsoft.ReportViewer.Common.dll Microsoft.ReportViewer.WinForms.dll 结果问题依旧,难道还缺? google后得知还缺一个 Microsoft.ReportViewer.ProcessingObjectModel.dll 这个可不好找,在C:\Wind

如何解决“Error detected while processing /root/.vimrc:”

使用crontab -e添加定时任务时,遇到如下错误"Error detected while processing /root/.vimrc:": [root@~]# crontab -e Error detected while processing /root/.vimrc: line 30: E518: Unknown option: fdm=syntax line 34: E518: Unknown option: autochdir 第一种方法: 直观地,根据提示,应该是不

解决方法:An error occurred on the server when processing the URL. Please contact the system administrator

在WINDOWS7或SERVER2008上安装了IIS7.5,调试ASP程序时出现以下错误: An error occurred on the server when processing the URL. Please contact the system administrator 解决方法如下:     设置方法一: 以管理员身份运行CMD,将目录定位到%windir%\system32\inetsrv\,然后执行appcmd set config -section:asp -script