题目描述

一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成\(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. 深入解析Python并发编程的多线程和异步编程

    本文分享自华为云社区<Python并发编程探秘:多线程与异步编程的深入解析>,作者:柠檬味拥抱. 在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别 ...

  2. Ubuntu防火墙相关

    查看防火墙当前状态 sudo ufw status 开启防火墙 sudo ufw enable 关闭防火墙 sudo ufw disable 查看防火墙版本 sudo ufw version 默认允许 ...

  3. Vue源码学习(十一):计算属性computed初步学习

    好家伙,   1.Computed实现原理 if (opts.computed) { initComputed(vm,opts.computed); } function initComputed(v ...

  4. Vue源码学习(十):关于dep和watcher使用的一些思考

    好家伙,   前面想了好久,都没想明白为什么要dep和watcher打配合才能实现数据-视图同步 为什么要多一个依赖管理这样的东西 给每个数据绑个watcher(xxfunction),然后,数据变了 ...

  5. 【Azure App Service】App Service设置访问限制后,使用git clone代码库出现403报错

    问题描述 在App Service中,为App Service配置了访问限制,结果导致在克隆App Service的代码时候,遇见403错误. 问题解答 因为在使用 git clone App Ser ...

  6. STL-RBTree模拟实现

    #pragma once #include<assert.h> #include<iostream> using std::cout; using std::endl; usi ...

  7. Seata的技术调研

    引子 本文不剖析业内分布式组件,只剖析seata这一组件的技术调研.看看是否存在接入价值. 一.概述 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata ...

  8. obs 录制教程 手机录屏用 向日葵 手机投屏 能用有线用有线的连接

    obs 录制教程 手机录屏用 向日葵 手机投屏 稍微有点卡 华为手机有个投屏 笔记本不支持这个 miracast 淘宝有卖 投屏设备的,搜 miracast 100多米 免费的就用向日葵就得了. 最新 ...

  9. Vite-vue3 架构设计

    Vite-vue3 架构设计 基础信息 Gitee项目地址:https://gitee.com/pengchenggang/vite-vue3 1 创建vite-vue3 初始化脚本 $ npm in ...

  10. Win10使用Dism++离线安装.Net3.5

    .Net3.5的安装包在Win10已经不能使用了,在线安装.Net3.5会很卡(跟网络无关),最好是使用Dism++提取Win10系统镜像文件离线安装. 打开Dism++软件,按照如下步骤操作: 选择 ...