题意:

有n个员工,每个员工完成一件A任务和一件B任务的时间给出,问要完成x件A任务y件B任务所需的最短时间是多少

思路:

DP + 二分我也是第一次见到,这个我只能说太难想了,根本想不到。

dp[i][j]表示在t时间内前i个人完成j件A任务后所能完成B任务的最大数量。

代码中还有一些注释。

 //#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int dp[][], a[], b[];
int _, n, x, y, kase = ; bool check(int t)
{
memset(dp, -, sizeof(dp));
dp[][] = ; for(int i = ; i <= n; ++i)
{
if(dp[i][x] >= y) return true;
for(int j = ; j <= x; ++j)
{
if(dp[i - ][j] != -)
{
int temp = min(t/a[i], x-j); //枚举第i个人可以做的A任务的个数
for(int k = ; k <= temp; ++k)
{
int t1 = (t - a[i] * k) / b[i]; //计算第i个人做k件A任务,所能做的B任务的个数
dp[i][j + k] = max(dp[i][j + k], dp[i - ][j] + t1); //选最优解
}
}
}
} if(dp[n][x] >= y) return true;
return false;
} int main(void)
{
#ifdef LOCAL
freopen("3433in.txt", "r", stdin);
#endif scanf("%d", &_);
while(_--)
{
scanf("%d%d%d", &n, &x, &y);
for(int i = ; i <= n; ++i)
scanf("%d%d", &a[i], &b[i]); int l = , r = a[] * x + b[] * y;
int ans = r;
while(l <= r)
{
int mid = (l + r) >> ;
if(check(mid))
{
ans = mid;
r = mid - ;
}
else l = mid + ;
} printf("Case %d: %d\n", ++kase, ans);
} return ;
}

代码君

HDU 3433 (DP + 二分) A Task Process的更多相关文章

  1. HDU 1025 DP + 二分

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1025 求最长递增子序列,O(n^2)的复杂度超时,需要优化为O(n*logn) f[i]存储长度为i的最小 ...

  2. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  3. hdu 3433 A Task Process 二分+dp

    A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. hdu 1025:Constructing Roads In JGShining's Kingdom(DP + 二分优化)

    Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65 ...

  5. 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...

  6. Hadoop:Task process exit with nonzero status of 1 异常

    在运行hadoop程序时经常遇到异常 java.io.IOException: Task process exit with nonzero status of 1.网上很多博文都说是磁盘不够的问题. ...

  7. POJ-2533最长上升子序列(DP+二分)(优化版)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 41944   Acc ...

  8. Linux中的task,process, thread 简介

    本文的主要目的是介绍在Linux内核中,task,process, thread这3个名字之间的区别和联系.并且和WINDOWS中的相应观念进行比较.如果你已经很清楚了,那么就不用往下看了. LINU ...

  9. hdu2993之斜率dp+二分查找

    MAX Average Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

随机推荐

  1. 三维云模拟Three.js

    http://www.mrdoob.com/#/131/clouds http://www.webgl.com/2012/03/webgl-demo-clouds/ <!DOCTYPE html ...

  2. 在linux下安装eclipse 开发c语言程序

    一,下载jdk tar -xvzf jdk-8u45-linux-x64.tar.gz  //解压并安装jdk 二,修改环境配置变量 vim /home/woshareliu/.bashrc 加入如下 ...

  3. eclipse编译项目jar,git管理代码

    2015-3-10 settings.xml文件: <localRepository>C:\Users\xxx\.m2\repository</localRepository> ...

  4. 解决IE不支持position:fixed问题

    #box { /* 非IE6浏览器使用固定元素 */ position:fixed; top:0; left:0; /* IE6改为绝对定位,并通过css表达式根据滚动位置更改top的值 */ _po ...

  5. js调试-定位到函数所在文件位置

    原文:http://www.cnblogs.com/52cik/p/js-console-show-source.html 在控制台输入要查找的函数名如votePost 然后回车: 函数源码粗显啦,并 ...

  6. 分布式数据存储 - MySQL双主复制

    上篇文章<分布式数据存储 - MySQL主从复制>,我们说到MySQL主从复制很好的保障了从库,读的高可用性.so,问题来了: 1.针对主库,写的高可用性又是如何做到高可用性? 2.如果需 ...

  7. POJ 2141

    #include<iostream> #include<stdio.h> using namespace std; int main() { //freopen("1 ...

  8. Activity学习(一)——状态转变

    (转自:http://blog.csdn.net/flowingflying/article/details/6415323) Android很大的应用场景是手机,有一些应用具有特别的优先级别,例如电 ...

  9. JDBC 程序的常见错误及调试方法

    详细介绍:http://dev.mysql.com/doc/refman/5.5/en/error-handling.html http://dev.mysql.com/doc/refman/5.5/ ...

  10. 李洪强iOS开发之OC[010] - 有参方法的声明实现和调用

    // //  main.m //  09 - 有参方法的声明实现和调用 // //  Created by vic fan on 16/7/5. //  Copyright © 2016年 李洪强. ...