LightOJ - 1180 Software Company(二分+dp)
2015-10-31 23:34
387 查看
题目大意:有两个任务,每个任务分成M块,有K个工人,给出每个工人完成每个任务每块所需要花费的时间,问同时完成任务时,至少需要花费多少时间
解题思路:用dp[i][j]表示用前i个工人完成第一个任务的j块时,能完成第二个任务的多少块
接着二分时间,再枚举工人,假设枚举到时间为mid,第i个工人,要求完成k块任务
则dp[i][j] = max(dp[i][j], (mid - k * timeA[i]) / timeB[i] + dp[i][j - k])
表示第i个工人完成第一个任务的k块后,剩余的时间去完成B任务了
解题思路:用dp[i][j]表示用前i个工人完成第一个任务的j块时,能完成第二个任务的多少块
接着二分时间,再枚举工人,假设枚举到时间为mid,第i个工人,要求完成k块任务
则dp[i][j] = max(dp[i][j], (mid - k * timeA[i]) / timeB[i] + dp[i][j - k])
表示第i个工人完成第一个任务的k块后,剩余的时间去完成B任务了
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 110; int a , b , dp ; int n, m, cas = 1; void init() { scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) scanf("%d%d", &a[i], &b[i]); } bool judge(int mid) { memset(dp, -1, sizeof(dp)); dp[0] = 0; for (int i = 0; i < n; i++) { int All = mid / a[i]; for (int j = m; j >= 0; j--) for (int k = 0; k <= All && k <= j; k++) if (~dp[j - k]) dp[j] = max(dp[j], dp[j - k] + (mid - k * a[i]) / b[i]); } return dp[m] >= m; } void solve() { int l = 0, r = 50010; while (l <= r) { int mid = (l + r) >> 1; if (judge(mid)) r = mid - 1; else l = mid + 1; } printf("Case %d: %d\n", cas++, r + 1); } int main() { int test; scanf("%d", &test); while(test--) { init(); solve(); } return 0; }
相关文章推荐
- 菜单 install parallets tools,同时解决 kernel sources 错误
- VC++中文件类型小结
- hdoj4727The Number Off of FFF
- 解决Jquery jsonp请求中dataFilter存在的问题
- centos 安装KVM及使用
- [Django与表单]request.META里包含了哪些数据?
- python
- nyoj 中位数 124 (数学)
- 疯狂JAVA讲义4.1--截取中文字符串
- Python 3 之 Chrom 截获的Headers转成dict格式
- PJSIP——Linux编译库并使用
- 提示信息国际化配置
- 02-使用C3P0连接池连接MySql并且使用QueryRunner简化数据库操作
- 解决无法通过80以外的端口访问应用程序
- JS学习笔记(01)—— 基础
- 安卓中的事务
- iOS设计模式 - 享元
- Linux下Python的安装以及注意事项
- 设置Linux中VIM编辑器的风格
- hdoj4726Kia's Calculation