【BZOJ 3233】 [Ahoi2013]找硬币
【题目 描述】
小蛇是金融部部长。 最近她决定制造一系列新的货币。 假设她要制造的货币 的面值为 x1, x2, x3… 那么 x1 必须为 1, xb 必须为 xa 的正整数倍(b>a)。 例如 1, 5, 125, 250 就是一组合法的硬币序列, 而 1, 5, 100, 125 就不是。 不知从哪一天开始, 可爱的蛇爱上了一种萌物——兔子! 从此, 小蛇便走上 了遇上兔子娃娃就买的不归路。 某天, 小蛇看到了 N 只可爱的兔子, 假设这 N 只 兔子的价钱分别是 a1, a2…aN。 现在小蛇想知道, 在哪一组合法的硬币序列下, 买这 N 只兔子所需要的硬币数最少。 买兔子时不能找零。
【输入格式】
第一行, 一个整数 N, 表示兔子的个数 第二行, N 个用空格隔开的整数, 分别为 N 只兔子的价钱
【输出格式】
一行, 一个整数, 表示最少付的钱币数。
【样例输入】
2
25 102
【样例输出】
4
【样例解释】
本次比赛试题由厦门一中提供 共有两只兔子, 价钱分别为 25 和 102。 现在小蛇构造 1, 25, 100 这样一组 硬币序列, 那么付第一只兔子只需要一个面值为 25 的硬币, 第二只兔子需要一 个面值为 100 的硬币和两个面值为 1 的硬币, 总共两只兔子需要付 4 个硬币。 这 也是所有方案中最少所需要付的硬币数。
【数据范围与约定】
对于 20%的数据, 1<=N<=20, 1<=ai<=5, 000
对于 100%的数据, 1<=N<=50, 1<=ai<=100, 000 部分数据随机.
一道不错的动态规划,考试的时候完全完全没有思路呢。
先考虑DP数组 f[i] 表示此时硬币面额的最大值为i时,买所有小兔纸所用的最少硬币,显然边界的 f[1]=∑1n ai
然后是转移。
f[i*j]=min(f[i*j],f[i]-ts[i*j]*(j-1)) (SMG??)
首先i和j都是数字i*j的因子咯,所以一个面值为i*j的硬币相当于j个面值为i的硬币,即j个i硬币可以变成 1 个i*j硬币,所以硬币数量就会减少 (j-1) 个啦。
然后ts数组里存的是i*j这个硬币最多可以用几次,就是 Sigma{a[k]/(i-j)} (打Sigma好辛苦)
具体看代码吧(并没有很长)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> #define For(i,a,b) for(register int i=a;i<=b;++i)
#define Re register
#define inf 0x7f7f7f
using namespace std;
const int N=,MN=1e5+;
int a[N],ts[MN],f[MN];
int n,mx=,fn;
inline void read(int &v){
v=;
char c=getchar();
while(c<''||c>'')c=getchar();
while(c>=''&&c<='')v=v*+c-'',c=getchar();
}
int main(){
// freopen("coin.in","r",stdin);
// freopen("coin.out","w",stdout);
read(n);
memset(f,inf,sizeof(f));
For(i,,n) read(a[i]),mx=max(a[i],mx);
For(i,,mx) For(j,,n) ts[i]+=a[j]/i;
fn=ts[]; f[]=ts[];
For(i,,mx){
fn=min(fn,f[i]);
for(Re int j=;j*i<=mx;++j){
f[i*j]=min(f[i*j],f[i]-ts[i*j]*(j-));
}
}
cout<<fn<<endl;
return ;
}
【BZOJ 3233】 [Ahoi2013]找硬币的更多相关文章
- BZOJ 3233: [Ahoi2013]找硬币
BZOJ 3233: [Ahoi2013]找硬币 标签(空格分隔): OI-BZOJ OI-DP Time Limit: 10 Sec Memory Limit: 64 MB Description ...
- BZOJ 3233: [Ahoi2013]找硬币( dp )
dp(x)表示最大面值为x时需要的最少硬币数. 枚举x的质因数p, dp(x) = min( dp(x/p) - (p-1) * sigma[a[i]/x] ). ----------------- ...
- [Bzoj3233][Ahoi2013]找硬币[基础DP]
3233: [Ahoi2013]找硬币 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 924 Solved: 482[Submit][Status][ ...
- [AHOI2013]找硬币(搜索)
[Ahoi2013]找硬币 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 348 Solved: 114[Submit][Status] Descri ...
- 【bzoj 3233】[Ahoi2013]找硬币 ——搜索
Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...
- BZOJ3233:[AHOI2013]找硬币(DP)
Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...
- [bzoj3233] [Ahoi2013]找硬币
一开始没什么思路...后来想到确定最大硬币面值就知道其他面值能取多少了..而且结果是可以由较小的面值转移过来的. f[i]表示最大面值为i时的最小硬币数.a[i]表示第i个物品的价钱. f[i]=mi ...
- [BZOJ 3233] 找硬币
Link: BZOJ 3233 传送门 Solution: 在本蒟蒻看来算是一道比较神的$dp$了 一开始转移方程都没看出来…… 首先,如果确定了最大面值,是能推出其他面值的所有可能值的 从而发现最大 ...
- 【刷题】BZOJ 4566 [Haoi2016]找相同字符
Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别为 ...
随机推荐
- python基础教程_学习笔记18:标准库:一些最爱——shelve
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/signjing/article/details/36029981 标准库:一些最爱 shelve S ...
- MySQL 的“root”用户修改密码
MySQL 的“root”用户默认状态是没有密码的,所以在 PHP 中您可以使用 mysql_connect("localhost","root"," ...
- (转)windows下一分钟配置ngnix实现HLS m3u8点播
一.首先保证nginx能正常运行: 这个就是因为前面我们把nginx的目录加到了Path中,然而nginx启动时各种路径都是以当前工作目录为起始点的,这就导致了系统去“C:\User ...
- 录音-树莓派USB摄像头话筒
实测可用: sudo arecord --duration=10 --device=plughw:1,0 --format=cd aaa.wav sudo arecord --duration=10 ...
- hibernate双向关联
双向关联中最好的设置是一端为inverse=true,一端为inverse=false. falses维护,true不维护,设置多的一方维护(false) inverse属性就是用来规定是由谁来维护这 ...
- finalize方法
什么是垃圾回收机制 不定时去堆内存中清理不可达对象.不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应 ...
- Matlab小技巧之怎么复制汉字
在我们复制Matlab到Word的过程中,经常会出现乱码的情况.这时候可以这么做. 1.复制Matlab代码. 2.新建一个txt文件,将代码粘贴到txt文件中. 3.复制txt文件中的代码到Word ...
- 第二篇:python基础之核心风格
阅读目录 一.语句和语法 二.变量定义与赋值 三.内存管理 内存管理: 引用计数: 简单例子 四.python对象 五.标识符 六.专用下划线标识符 七.编写模块基本风格 八.示范 一.语句和语法 # ...
- legend2---开发日志13(layer_mobile的content传入dom 出现【object object】如何解决)
legend2---开发日志13(layer_mobile的content传入dom 出现[object object]如何解决) 一.总结 一句话总结: layer_mobile.content只能 ...
- 从Github上下载了项目,导入Android Studio,gradle 报错,应该怎么修改
一.从Github上获取源代码 我这里是直接下载ZIP文件 二.在本机的Android Studio上新建一个空白项目,目的主要是与刚从Github上下载的项目文件结构做对比 三.替换gradle文件 ...