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

本文共 799 字,大约阅读时间需要 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;}

  

转载地址:http://vobum.baihongyu.com/

你可能感兴趣的文章
关于oracle用户管理权限
查看>>
sort,uniq,wc指令简单用法
查看>>
傻瓜式游戏工具引擎
查看>>
mysql 5.7.13 二进制版本的安装
查看>>
让你的Angular2应用更加流畅
查看>>
C++ STL中Map的按Key排序和按Value排序
查看>>
Vue.js 学习资料汇总
查看>>
iframe中的各种跳转方法
查看>>
zabbix2.4.6 RPM安装
查看>>
oracle创建新用户只有mes账户下四张表的查询权限
查看>>
快速排序
查看>>
菜鸟第一次写博客
查看>>
mac上设置robotium环境的总结
查看>>
配置RabbitMQ默认群集模式
查看>>
sshd服务启动报错
查看>>
Fisher_Yates_Shuff
查看>>
Windows To Go:Windows 8住进U盘里
查看>>
MySql远程连接数据库is not allowed to connect to this MySQL server
查看>>
think.js/cnpm/作用域/回调函数/事件编程
查看>>
oracle编程、操作不良习惯总结
查看>>