题目描述

一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成\(m\)个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用的天数是相同的,并且是已知的,但完成不同软件的一个模块的时间是不同的,每个技术人员在同一时刻只能做一个模块,一个模块只能由一个人独立完成而不能由多人协同完成。一个技术人员在整个开发期内完成一个模块以后可以接着做任一软件的任一模块。写一个程序,求出公司最早能在什么时候交付软件。

输入

输入文件第一行包含两个由空格隔开的整数\(n\)和\(m\)。

接下来的\(n\)行每行包含两个用空格隔开的整数\(d_1\)和\(d_2\),\(d_1\)表示该技术人员完成第一个软件中的一个模块所需的天数,\(d_2\)表示该技术人员完成第二个软件中的一个模块所需的天数。

输出

输出文件仅有一行包含一个整数\(d\),表示公司最早能于\(d\)天后交付软件。

输入样例

1 1
2 4
1 6

输出样例

18

提示

数据规模

对于100%的数据,\(1≤n≤100,1≤m≤100,1≤d_1,d_2≤100\)。

样例说明

最快的方案是第一个技术人员完成第二个软件的\(18\)个模块,用时\(18\)天,第三个技术人员完成第一个软件的\(18\)个模块,用时\(18\)天,其余的模块由第二个技术人员完成,用时\(12\)天,做完所有的模块需要\(18\)天。如果第一个技术人员完成第二个软件的\(17\)个模块,第三个技术人员完成第一个软件的\(17\)个模块,其余的模块由第二个技术人员完成,需要用时\(18\)天,做完所有模块仍然需要\(18\)天,所以少于\(18\)天不可能做完所有模块。

思路

这个完成天数可能否完成存在一个线性关系,所以这肯定是到二分答案的题目。问题在于如何进行判断能否完成。

首先假设 \(f_{i,j}\)表示到第\(i\)个技术人员的时候,第一个软件已经完成了\(j\)个模块,第二个软件可以完成的模块数量。先给出状态转移方程

\[f_{i,j}=\underset{0\le k \le min{\left [\frac{day}{d_{1,i}}\right ] }}{\text max} \left \{ f_{i-1,j-k}+\left [ \frac{day-k\times d_{1,i}}{d_{2,i}} \right ] \right \}
\]

其中\(day\)表示二分的天数,\(k\)表示\(i\)个人抽出做程序1去做程序2的时间。

最终如果\(f_m\ge m\),那么就可以在 \(day\) 天完成这两个项目。

时间复杂度为 \(O(n\times m^2 \times log m)\)

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std; const int N = 102; int d1[N];
int d2[N]; int n, m; int f[N]; inline bool check(int day)
{
f[0] = 0;
for (int i = 1; i <= m; i++)
f[i] = -1e9; //要保证 程序1 的 i个模块一定做的完,那就让 做 程序1 的 i个模块 时 程序2 什么都不要做
for (int i = 1; i <= n; i++) //枚举每个人
for (int j = m; j >= 0; j--) //能够完成 软件1 m个模块时候
for (int k = 0; k <= min(day / d1[i], j); k++) //现在第i个人选择抽出做 软件1 k个模块的时间,来做 软件2
f[j] = max(f[j], f[j - k] + (day - d1[i] * k) / d2[i]);
return f[m] >= m; //程序1 做 m个模块的时候,程序2 也至少能完成任务
} int main()
{
int l = 1, r = 0;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
{
scanf(" %d %d", &d1[i], &d2[i]);
r = max(r, m * d1[i]);
r = max(r, m * d2[i]);
}
while (l < r)
{
int mid = l + r >> 1;
if (check(mid))
r = mid;
else
l = mid + 1;
}
printf("%d", r);
return 0;
}

[一本通1677/JZOJ1217/CJOJ1101]软件开发 题解的更多相关文章

  1. 【BZOJ】1221: [HNOI2001] 软件开发(最小费用最大流)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1221 先吐槽一下,数组依旧开小了RE:在spfa中用了memset和<queue>的版本 ...

  2. [HNOI 2001]软件开发

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  3. bzoj 1221 [HNOI2001] 软件开发 费用流

    [HNOI2001] 软件开发 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1938  Solved: 1118[Submit][Status][D ...

  4. 【bzoj1221】[HNOI2001] 软件开发 费用流

    题目描述 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消 ...

  5. BZOJ1221 [HNOI2001] 软件开发 【费用流】

    题目 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消毒毛 ...

  6. BZOJ 1221 [HNOI2001] 软件开发 费用流_建模

    题目描述:   某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供 ...

  7. nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞

    第0.1节 HTML5和桌面软件开发的碰撞 当我们谈论桌面软件开发技术的时候,你会想到什么?如果不对技术本身进行更为深入的探讨,在我的世界里,有这么多技术概念可以被罗列出来(请原谅我本质上是一个Win ...

  8. 敏捷软件开发VS传统软件工程

    敏捷软件开发:又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新兴软件开发方法,是一种应对快速变化的需求的一种软件开发能力. 与传统软件工程相比,它们的具体名称.理念.过程.术语都不尽相同 ...

  9. Atitit.软件开发的三层结构isv金字塔模型

    Atitit.软件开发的三层结构isv金字塔模型 第一层,Implements 层,着重与功能的实现.. 第二次,spec层,理论层,设计规范,接口,等.流程.方法论 顶层,val层,价值观层,原则, ...

  10. BZOJ 1221: [HNOI2001] 软件开发

    1221: [HNOI2001] 软件开发 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1428  Solved: 791[Submit][Stat ...

随机推荐

  1. vue 前端自动打开文件地址进行下载

    最近在做异步导出的功能,导出的过程中前端另外启动一个查询导出进度的线程接口.如果导出完成后,把生成的文件上传到服务器,返回给前端一个文件的下载地址:前端自动打开这个地址进行跳转下载. 有两种方式 1. ...

  2. 骚操作之 持有 ReadOnlySpan 数据

    ReadOnlySpan<T> 可以说现在高性能操作的重要基石 其原理有兴趣的同学可以看 2018 的介绍Span<T>文章 其为了保障大家安全使用做了相应的限制 那么有没方法 ...

  3. MacOS安装多个jdk

    环境 Mac os 为Yosemite 10.10.5版本,想要同时使用jdk7和jdk8. 下载jdk:http://www.Oracle.com/technetwork/Java/javase/d ...

  4. 【Azure 应用服务】如何为Web Jobs 安装Python包呢?

    问题描述 WebJobs 怎么安装Python包? 问题解答 第一步:登录到App Service的高级管理工具(Kudu:https://<webappname>.scm.chinacl ...

  5. 云原生 on nLive:云上 Nebula Graph

    本文首发于 Nebula Graph Community 公众号 在 #云原生# 主题分享中,来自 Nebula 云组的 Cloud 专家乔雷同大家分享云的相关知识,本文整理自该次主题直播. 云原生是 ...

  6. 机器学习可解释性--shapvalue

    A Unified Approach to Interpreting Model Predictions trusting a prediction or trusting a model 如果⼀个机 ...

  7. Java 类方法的声明和使用

    1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...

  8. Python基础之程序与用户交互

    [一]Python基础之程序与用户交互 [一]程序如何与用户交互 用户通过input命令在窗口内与输入就可以让用户和窗口进行交流 input接受的所有数据类型都是 str 类型 username = ...

  9. centos python3虚拟环境

    为什么需要虚拟环境? 在使用 Python 语言时,通过 pip(pip3)来安装第三方包,但是由于 pip 的特性,系统中只能安装每个包的一个版本.但是在实际项目开发中,不同项目可能需要第三方包的不 ...

  10. 手爱图仕Aputure MC RGB摄影补光灯体验测评

    前记  作为一个智能硬件设备狂兼智能硬件方案提供商,工作就是和各种智能硬件打交道.最近无意入手了一个爱图仕Aputure MC RGB摄影补光灯.顺便体验了几天,既然体验了,肯定要写一个体验结果的.这 ...