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

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

题意

给定\(n\)个砝码和\(m(1 \le n, m \le 100000)\)个背包\((1 \le n_i, m_i \le 1000000000)\),保证对于任意两个砝码都有一个是另一个的正整数倍,求最多拿走多少砝码。

分析

砝码的种类不会超过\(30\)种。

小的肯定在大的前面放。

题解

分出\(s\)种种类后,我们将背包用\(s\)个数的进制来表示。那么从小到大地放,如果当前进制的系数不够了,则向前面借位,依次类推。

#include 
using namespace std;inline int getint() { int x=0, c=getchar(); for(; c<48||c>57; c=getchar()); for(; c>47&&c<58; x=x*10+c-48, c=getchar()); return x;}const int N=100005;int a[N], b[N], s[35], c[35];int main() { int n=getint(), m=getint(); for(int i=1; i<=n; ++i) { a[i]=getint(); } for(int i=1; i<=m; ++i) { b[i]=getint(); } sort(b+1, b+1+m); int tot=0; for(int i=1; i<=m; ++i) { if(b[i]!=b[i-1]) { b[++tot]=b[i]; } ++s[tot]; } for(int i=1; i<=n; ++i) { for(int j=tot; j; --j) { c[j]+=a[i]/b[j]; a[i]%=b[j]; } } int ans=0; for(int i=1; i<=tot; ++i) { for(int j=i+1; j<=tot && s[i]>c[i]; ++j) { int cost=b[j]/b[i], rest=s[i]-c[i], need=(rest+cost-1)/cost; if(need<=c[j]) { c[j]-=need; rest=(need*cost-rest)*b[i]; c[i]=s[i]; for(int k=j; k>i; --k) { c[k]+=rest/b[k]; rest%=b[k]; } } else { c[i]+=c[j]*cost; c[j]=0; } } ans+=min(s[i], c[i]); } printf("%d\n", ans); return 0;}

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

你可能感兴趣的文章
gevent
查看>>
LightOJ 1018 Brush (IV)(记忆化搜索)
查看>>
x264编码参数大测试:03 subme与crf(c)
查看>>
对自然数的有限区间散列
查看>>
低端路由器和高端路由的区别
查看>>
android webview 播放swf 失败<彻底解决黑框>
查看>>
应用程序实例——用户信息管理
查看>>
中文分词 mmseg4j 在 lucene 中的使用示例
查看>>
volley 发送post请求
查看>>
ti processor sdk linux am335x evm /bin/setup-uboot-env.sh hacking
查看>>
php 操作数组 (合并,拆分,追加,查找,删除等)
查看>>
[Hibernate] - EAGER and LAZY
查看>>
python 异常类型
查看>>
CentOS进入图形界面
查看>>
C#--web services之wsdl文件生成cs
查看>>
配置Apache+Tomcat实现SSO(单点登录)
查看>>
《Pro ASP.NET MVC 3 Framework》学习笔记之十五【示例项目SportsStore】
查看>>
Ext右键菜单完整版
查看>>
2012年1月凯立德地图普高清全分辨率懒人包P1750-D5616-2721J09(完美破解,已上路实测,永久下载地址)...
查看>>
SwipeBackActivity 的使用
查看>>