[luogu]P1800

software_NOI导刊2010提高(06)

题目描述

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

输入输出格式

输入格式:

输入文件第一行包含两个由空格隔开的整数n和m,其中1<=n<=100,1<=m<=100,接下来的n行每行包含两个用空格隔开的整数d1和d2,d1表示该技术人员完成第一个软件中的一个模块所需的天数,d2表示该技术人员完成第二个软件中的一个模块所需的天数,其中1<= d1,d2<=100。

输出格式:

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

输入输出样例

输入样例1#:

3 20
1 1
2 4
1 6

输出样例1#:

18

说明

【样例】

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


一道神奇的题目,容易想到答案是单调的,考虑二分答案。

但是检验...一开始要贪心的,想想完全不行啊啊啊!!!

可恶,偷看一下神犇的题解,真的牛!

每个人其实相互独立,各干各的,最后求他们的最大值,最小化最大值。

所以我们只需要让n个人第一个做满,最大化第二个,如果>=m,则可以。

所以我们用f[i][j]表示前i个人第一个软件做了j个,可以最多做的第二个软件。

转移:
f[i][j]=Max{f[i-1][j-k]+(mid-d1[i]*k)/d2[i]} 【如果第i个选择了k个,只剩下(mid-d1[i])/d2[i]个可以做(将每个决策独立出来,好方法,NB。)】

还有就是可恶的边界,不存在的状态要初始化一个很小的数。f[0][0]=0;

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. inline int read();
  6. int Max(int x,int y){return x>y?x:y;}
  7. int Min(int x,int y){return x<y?x:y;}
  8. namespace lys{
  9. ;
  10. int dp[N][N],d1[N],d2[N];
  11. int n,m;
  12. bool chk(int mid){
  13. int i,j,k;
  14. memset(dp,-,sizeof dp);
  15. dp[][]=;
  16. ;i<=n;i++)
  17. ;j<=m;j++)
  18. ;k<=Min(j,mid/d1[i]);k++) dp[i][j]=Max(dp[i][j],dp[i-][j-k]+(mid-d1[i]*k)/d2[i]);
  19. return (dp[n][m]>=m);
  20. }
  21. int main(){
  22. int i;
  23. n=read(); m=read();
  24. ;i<=n;i++) d1[i]=read(),d2[i]=read();
  25. ,r=,mid;
  26. while(l<r){
  27. mid=(l+r)>>;
  28. if(chk(mid)) r=mid;
  29. ;
  30. }
  31. printf("%d\n",l);
  32. ;
  33. }
  34. }
  35. int main(){
  36. lys::main();
  37. ;
  38. }
  39. inline int read(){
  40. ,ff=;
  41. char c=getchar();
  42. '){
  43. ;
  44. c=getchar();
  45. }
  46. +c-',c=getchar();
  47. return kk*ff;
  48. }

[luogu]P1800 software_NOI导刊2010提高(06)[DP][二分答案]的更多相关文章

  1. P1800 software_NOI导刊2010提高(06)

    P1800 software_NOI导刊2010提高(06) 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术 ...

  2. P1800 software_NOI导刊2010提高(06)(二分答案)

    P1800 software_NOI导刊2010提高(06) 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术 ...

  3. 洛谷P1800 software_NOI导刊2010提高(06)

    P1800 software_NOI导刊2010提高(06) 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术 ...

  4. 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)

    P1800 software_NOI导刊2010提高(06) 标签 二分答案 难度 普及/提高- 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每 ...

  5. 洛谷 P1800 software_NOI导刊2010提高(06)

    题目链接 题解 二分答案+dp 如果我们知道答案,贪心地想,让每个人做尽量多的模块一定不会比最优解差 \(f[i][j]\)表示前\(i\)个人第一个模块做了\(j\)块,第二个模块最多能做多少 然后 ...

  6. Luogu P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  7. P1799 数列_NOI导刊2010提高(06)

    P1799 数列_NOI导刊2010提高(06)f[i][j]表示前i个数删去j个数得到的最大价值.if(i-j==x) f[i][j]=max(f[i][j],f[i-1][j]+1); else ...

  8. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  9. 洛谷 P1801 黑匣子_NOI导刊2010提高(06)(未完)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

随机推荐

  1. 2019JAVA第七次实验报告

    Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间 2019.10.25 评分等级 实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)1 ...

  2. nodejs以对象做对象的key导致value一直被覆盖

      问题描述 在开发中,实现技能状态的事件监听功能时,将状态对象作为key,存入事件管理器的监听列表,如下图: 实现后,运行程序,并没有报错,但是当某个事件发生时,只有一个状态被触发监听,而大多数状态 ...

  3. tomcat的相关

    [针对tomcat修改,那么就直接找关于tomcat的相关文件目录进行修改即可] 1.对tomcat进行相关的操作,启动tomcat时,让其不要出现tomcat主页,与之相反的让其出现404的界面! ...

  4. pycharm中ctrl + C复制, ctrl+A全选等快捷键失效

    原因是:在安装pycharm的时候也同时安装了vim插件,需要在settings  - > vim Emulation里将相关的handler改成 IDE

  5. 字典树(trie树) 后缀树 广义后缀树

    转自:http://www.cnblogs.com/dong008259/archive/2011/11/11/2244900.html (1)字典树(Trie树) Trie是个简单但实用的数据结构, ...

  6. postgresql 用 like 可以 复制结构包括主键约束

    create tabletablename ( like tablename INCLUDING INDEXES INCLUDING COMMENTS); PostgreSQL 动态表复制(CREAT ...

  7. 在CentOS7上无人值守安装Zabbix4.2

    #!/bin/bash # 检查操作系统版本,该脚本只能运行在 Centos .x 系统上 cat /etc/redhat-release |grep -i centos |grep '7.[[:di ...

  8. 28、周末看电影(每周五自动从top250中随机选取三部电影,并将下载链接发到邮箱里)

      练习介绍   在第3关的一个课后练习里,我们爬取了指定电影的下载链接:在第6关的一个课后练习里,我们存储了豆瓣TOP250的榜单信息.   现在,我们完善这个程序,每周五在存储的榜单中,随机抽三部 ...

  9. 运维LVS-NAT模式理解

    一.LVS-NAT模式的工作原理这个是通过网络地址转换的方法来实现调度的.首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个 后端的真实服务器(RS ...

  10. linux相关命令大全......持续更新

    启动项目8080端口被占用,然而老久没玩Linux,命令忘光了,杀死进程都不记得了. 决定整理一波吧....... Linux: sudo强制执行,不在root用户下时使用. top 相当于windo ...