hdu3433A Task Process( 二分dp)
2024-08-28 10:34:48
二分时间,在时间内dp[i][j]表示截止到第i个人已经做了j个A最多还能做多少个B
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 200000
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
int a[],b[];
int dp[][];
int main()
{
int n,i,j,t,x,y,g,kk=;
cin>>t;
while(t--)
{
scanf("%d%d%d",&n,&x,&y);
int minz = N;
for(i = ; i <= n ;i++)
{
scanf("%d%d",&a[i],&b[i]);
minz = min(minz,a[i]*x+b[i]*y);
}
int low = ,high = minz,mid;
while(low<=high)
{
mid = (low+high)>>;
memset(dp,-,sizeof(dp));
for(i = ; i <= x ; i++)
{
if(a[]*i<=mid)
dp[][i] = (mid-a[]*i)/b[];
}
for(i = ; i <= n ;i++)
{
for(j = ;j <= x ;j++)
for(g = ; g <= x-j ; g++)
{
if(mid<a[i]*j) break;
if(dp[i-][g]==-) break;
dp[i][j+g] = max(dp[i][j+g],(mid-a[i]*j)/b[i]+dp[i-][g]);
}
}
if(dp[n][x]>=y)
high = mid-;
else
low = mid+;
}
printf("Case %d: ",++kk);
cout<<low<<endl;
}
return ;
}
最新文章
- NYOJ214
- SQL语句方法语法总结(三)
- codeforces 631A Interview
- 解决phpmyadmin-1800秒超时链接失效问题
- Mongodb 上传图片
- 应用控制台应用程序开发批量导入EXEL程序。
- Java类加载器详解
- Scikit-learn:scikit-learn快速教程及实例
- hadoop伪分布式搭建
- jquery/js知识点收藏
- 学习Struts--Chap05:值栈和OGNL
- 常用http/https以及socks5代理总结
- 浅谈ES6原生Promise
- Linux 基础一(系统分区、格式化与挂载)
- Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider(8)
- Windows操作系统下SVN无法上传*.o文件
- visual studio 各种错误汇总
- 基于easyui开发Web版Activiti流程定制器详解(五)——Draw2d详解(一)
- (一)ElasticSearch-入门
- vector的哈希值 Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined) C