• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
KのMidGard
人是人的一场雨,你终将独自前行。
博客园    首页    新随笔    联系   管理    订阅  订阅

[POJ1973]Software Company

有两种工作需要N个工人完成,每种工作各有M份,而每个工人完成一份A工作、B工作各需要A[i],B[i]时间,求完成所有工作所需最少时间。

题目大意:有两种工作需要N个工人完成,每种工作各有M份,而每个工人完成一份A工作、B工作各需要A[i],B[i]时间,求完成所有工作所需最少时间。

 

二分答案,用dp[i]表示完成i份A工作所能完成的最多B工作即可

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 120
#define INF -214748364
long test,n,m,a[N],b[N],i,j,k,t,v,low,high,dp[N][N];
int main(){
scanf("%d",&test);
while(test--){
scanf("%d%d",&n,&m);
j=0;
for(i=0;i<n;i++){
scanf("%d%d",&a[i],&b[i]);
j=max(j,a[i]);
j=max(j,b[i]);
}
high=(m*2/n+2)*j;
low=1;
while(low<high){
t=(low+high)>>1;
for(i=(t/a[0]);i>=0;i--) dp[0][i]=(t-i*a[0])/b[0];
for(i=(t/a[0])+1;i<=m;i++) dp[0][i]=INF;
for(i=1;i<n;i++){
for(j=0;j<=m;j++) dp[i][j]=dp[i-1][j];
for(k=(t/a[i]);k>=0;k--){
v=(t-(a[i]*k))/b[i];
for(j=k;j<=m;j++) dp[i][j]=max(dp[i][j],dp[i-1][j-k]+v);
}
}
if(dp[n-1][m]>=m) high=t;
else low=t+1;
}
printf("%d\n",low);
}
return 0;
}



posted @ 2011-11-03 00:59  风行狩  阅读(246)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3