Codeforces Round #350 (Div. 2) (二分答案)
2016-05-06 17:28
393 查看
【题意】给了n个物品和k,a[i]表示做成第i个物品需要的材料,b[i]表示当前第i种物品的材料重量。k代表可以在任意一种物品,或者多个添加该种物品的不定重量,最后求可以合成的最多的物品数。
【分析】裸二分答案,就是数据范围有点坑,还要注意二分的姿势,二分最近总是写错,以前还没有错过。
【AC代码】
【ps贴一个队长的神版本】
【分析】裸二分答案,就是数据范围有点坑,还要注意二分的姿势,二分最近总是写错,以前还没有错过。
【AC代码】
//623 ms #include <bits/stdc++.h> using namespace std; #define ll long long const int maxn = 100010; int n; ll k; ll a[maxn],b[maxn]; ll solve(ll x){ ll cur=k; for(int i=0; i<n; i++){ ll temp = b[i]-a[i]*x; if(temp<0) cur+=temp; if(cur<0) return -1; } return 1; } int main(){ cin>>n>>k; for(int i=0; i<n; i++) cin>>a[i]; for(int i=0; i<n; i++) cin>>b[i]; ll l=0,r=3e9; while(l<=r){ ll mid = (l+r)>>1; if(solve(mid)<0) r=mid-1; else l=mid+1; } cout<<l-1<<endl; return 0; }
【ps贴一个队长的神版本】
//46 ms #include<cstdio> #include<cstring> int a[100005],b[100005]; int k,n; bool judge(int x) { int kk=k; for(int i=1;i<=n;i++) { int y=b[i]+kk; if(x>y/a[i]) return 0; y=a[i]*x; if(y>b[i]) kk-=y-b[i]; } return 1; } int main() { scanf("%d %d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%d",&b[i]); int l=0,r=2e9; while(l<r) { int mid=l+(r-l+1)/2; // printf("%d\n",mid); if(judge(mid)) l=mid; else r=mid-1; } printf("%d\n",l); return 0; }
相关文章推荐
- python正则式
- RMAN备份动态性能视图 V$BACKUP_SET_DETAILS
- 关于&运算符
- 栈及栈的链式存储结构(栈链)
- 进化成弃坑大师
- iOS-键盘弹出的类型
- 2个git仓库共用文件夹的实现
- 每天一个linux命令(61):wget命令
- LifrRay Portlet前后台参数和方法调用的笔记
- 【Android基础】PullToRefreshListView OnItemLongClickListener长按事件
- $.getJSON 和 $.each 的用法
- 【DirectX11】第一篇 DirectX11简介
- UVA, 11380Down Went The Titanic(最大流,拆点)
- jquery提示信息 tips
- java web 开发 乱码处理
- ConcurrentModificationException
- python 安装第三方模块
- 学习Spring ioc 容器
- JaConTeBe benchmark
- 部署到Linux使用VS Code 开发.NET Core 应用程序