bzoj 5281 Talent Show —— 01分数规划+背包
2024-08-23 23:32:21
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5281
二分一个答案比值,因为最后要*1000,不如先把 v[] *1000,就可以二分整数;
枚举 mid ,如果 mid 小于等于 ans ,则 ∑v[i] - mid * ∑w[i] >= 0,可以继续往大调整,为了使答案最大,背包找一下使这个值最大的组合,看看能否 >=0;
数组开 1000 即可... 把 w 大于 1000 的直接当做最大的 w 。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
int const xn=;
int n,m,ans,w[xn];
ll f[],tmp[xn],v[xn];
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
bool ck(int k)
{
for(int i=;i<=n;i++)tmp[i]=v[i]-(ll)w[i]*k;
memset(f,-,sizeof f);//
f[]=;
for(int i=;i<=n;i++)
for(int j=m;j>=;j--)
f[min(m,j+w[i])]=max(f[min(m,j+w[i])],f[j]+tmp[i]);
return f[m]>=;
}
int main()
{
n=rd(); m=rd();
for(int i=;i<=n;i++)w[i]=rd(),v[i]=rd()*;
int l=,r=1e9;
while(l<=r)
{
if(ck(mid))ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
return ;
}
最新文章
- 如何利用ETW(Event Tracing for Windows)记录日志
- UGUI全面实践教程
- java 字符串zlib压缩/解压
- javascript之基本包装类型(Boolean,Number,String)基础篇
- iOS真机调试——申请开发者证书
- Java单元测试:@BeforeClass,@Before,@Test,@After,@AfterClass中的问题详解
- cursor 属性
- 原生js写ajax请求(复习)
- 微信小程序-获取经纬度
- supergridcontrol记录,分页
- 14)django-模板(计数器)
- hadoop启动
- input框的输入限制
- hdu1573 X问题【中国剩余定理】
- 算法总结(转自CS-Notes)
- learn python the hard way 习题1~5总结
- Pamulinawen--IPA--菲律宾伊洛卡诺语
- 《JAVA与模式》之访问者模式
- 将本地已有项目上传到github
- Jenkins插件开发(四)-- 插件发布
热门文章
- POJ 2115 C Looooops【数论】
- 路由选择(codevs 1062)
- CERC 2014 (动态树+主席树)
- Separate code and data contexts: an architectural approach to virtual text sharing
- msp430项目编程16
- 通过分析system_call中断处理过程来深入理解系统调用
- jquery serializeArray() 方法通过序列化表单值来创建对象数组(名称和值)。
- 关于oracle存储过程的若干问题备忘
- css实现文字渐变
- canvas仿芝麻信用分仪表盘