博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1800 software_NOI导刊2010提高(06)
阅读量:4678 次
发布时间:2019-06-09

本文共 1328 字,大约阅读时间需要 4 分钟。

题目描述

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


我感觉oi中就就这么几种题目:

1.寻找答案题

2.带入答案检验题

3.数据结构题

4.完成某种目的的题


二分答案+dp检验

如果你感觉寻找答案不会的话。可以考虑二分答案

dp用的是背包

\(f[i]\)表示在干m天(m由二分得来)时干了i个第一个软件的模块时,干了多少个二软件的模块

#include
#include
#include
#include
using std::max;const int maxn=110;int n,m;int f[2][maxn];//填表法int m1[maxn],m2[maxn];bool check(int val){ memset(f,0,sizeof(f));/每次清空 f[0][0]=1;//初始化,为了不引起和无法到达的情况混淆的麻烦,都先加1. for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) { f[i&1][j]=0; for(int k=0;k<=j&&val-k*m1[i]>=0;k++)//完全背包,不过不能用优化 if(f[(i&1)^1][j-k]) f[i&1][j]=max(f[i&1][j],f[(i&1)^1][j-k]+(val-k*m1[i])/m2[i]); } if(f[n&1][m]-1>=m) return true;//这里要减1 return false;}int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&m1[i],&m2[i]); int l=1,r=20000; while(l
>1; if(check(mid)) r=mid; else l=mid+1; } printf("%d",l);}

转载于:https://www.cnblogs.com/Lance1ot/p/9501872.html

你可能感兴趣的文章
Mouse点击之后,复制GridView控件的数据行
查看>>
ASP.NET开发,从二层至三层,至面向对象 (2)
查看>>
如何查看自己电脑支持OpenGL core版本
查看>>
页面元素定位 XPath 简介
查看>>
[转]loadrunner:系统的平均并发用户数和并发数峰值如何估算
查看>>
Linux下Tomcat重新启动
查看>>
HTML Table to Json
查看>>
Theano 学习笔记(一)
查看>>
1.7 节点进行排序显示
查看>>
web最佳实践
查看>>
spring 集成shiro 之 自定义过滤器
查看>>
验证密码不允许有连续三位重复的正则表达式
查看>>
python 中对list去重
查看>>
Mono Libgdiplus库
查看>>
js模糊查询案例
查看>>
c语言基础知识要点
查看>>
Android模拟器无法上网访问网络失败解决办法
查看>>
node启动时, listen EADDRINUSE 报错;
查看>>
vue学习链接
查看>>
Systemd 初始化进程
查看>>