博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1110 : [POI2007]砝码Odw
阅读量:4677 次
发布时间:2019-06-09

本文共 849 字,大约阅读时间需要 2 分钟。

砝码从小到大放最优,二分答案mid,转化为判定前mid小的砝码能否放完。

从大到小考虑砝码,依次扫描每个容器,能放就放。

由于砝码重量都成倍数关系,所以最多只有$O(\log n)$种不同的数字,所以总复杂度为$O(n\log^2n)$。

 

#include
#include
#define N 100010int n,m,i,j,k,t,a[N],b[N],c[N],l,r,mid,ans;inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}bool check(int x){ for(i=1;i<=n;i++)c[i]=a[i]; for(;x;x=j){ for(j=x-1;b[x]==b[j];j--); for(t=x-j,i=1;i<=n&&t;i++){ k=c[i]/b[x]; if(k>t)k=t; c[i]-=k*b[x],t-=k; } if(t)return 0; } return 1;}int main(){ read(n),read(m); for(i=1;i<=n;i++)read(a[i]); for(i=1;i<=m;i++)read(b[i]); std::sort(b+1,b+m+1),l=1,r=m; while(l<=r)if(check(mid=(l+r)>>1))l=(ans=mid)+1;else r=mid-1; return printf("%d",ans),0;}

  

转载于:https://www.cnblogs.com/clrs97/p/4614599.html

你可能感兴趣的文章
Oracle和Mysql的区别 转载
查看>>
GOF23设计模式
查看>>
Python自然语言处理学习笔记(41):5.2 标注语料库
查看>>
山寨“饿了么”应用中添加菜品数量按钮效果
查看>>
TCP/IP系列——长连接与短连接的区别
查看>>
Linux基础——常用命令
查看>>
Python学习笔记三(文件操作、函数)
查看>>
二进制分组
查看>>
[ACM] POJ 1068 Parencodings(模拟)
查看>>
Drools只执行一个规则或者执行完当前规则之后不再执行其他规则(转)
查看>>
冰点还原8.57 官方中文版下载
查看>>
poj 2236(并查集的应用)
查看>>
C 栈 链式存储
查看>>
Java 游戏报错 看不懂求教
查看>>
APP自动化测试
查看>>
HTML中让表单input等文本框为只读不可编辑的方法
查看>>
nodejs做中间层,向后端取数据
查看>>
IntelliJ IDEA 2017 MySQL5 绿色版 Spring 4 Mybatis 3 配置步骤详解(二)
查看>>
(转)Java DecimalFormat 用法(数字格式化)
查看>>
hiho_100_八数码
查看>>