【题目 描述】

小蛇是金融部部长。 最近她决定制造一系列新的货币。 假设她要制造的货币 的面值为 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]找硬币的更多相关文章

  1. BZOJ 3233: [Ahoi2013]找硬币

    BZOJ 3233: [Ahoi2013]找硬币 标签(空格分隔): OI-BZOJ OI-DP Time Limit: 10 Sec Memory Limit: 64 MB Description ...

  2. BZOJ 3233: [Ahoi2013]找硬币( dp )

    dp(x)表示最大面值为x时需要的最少硬币数. 枚举x的质因数p,  dp(x) = min( dp(x/p) - (p-1) * sigma[a[i]/x] ). ----------------- ...

  3. [Bzoj3233][Ahoi2013]找硬币[基础DP]

    3233: [Ahoi2013]找硬币 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 924  Solved: 482[Submit][Status][ ...

  4. [AHOI2013]找硬币(搜索)

    [Ahoi2013]找硬币 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 348  Solved: 114[Submit][Status] Descri ...

  5. 【bzoj 3233】[Ahoi2013]找硬币 ——搜索

    Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...

  6. BZOJ3233:[AHOI2013]找硬币(DP)

    Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125, ...

  7. [bzoj3233] [Ahoi2013]找硬币

    一开始没什么思路...后来想到确定最大硬币面值就知道其他面值能取多少了..而且结果是可以由较小的面值转移过来的. f[i]表示最大面值为i时的最小硬币数.a[i]表示第i个物品的价钱. f[i]=mi ...

  8. [BZOJ 3233] 找硬币

    Link: BZOJ 3233 传送门 Solution: 在本蒟蒻看来算是一道比较神的$dp$了 一开始转移方程都没看出来…… 首先,如果确定了最大面值,是能推出其他面值的所有可能值的 从而发现最大 ...

  9. 【刷题】BZOJ 4566 [Haoi2016]找相同字符

    Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两个子串中有一个位置不同. Input 两行,两个字符串s1,s2,长度分别为 ...

随机推荐

  1. Hibernate中的事务处理流程详解

    一.Hibernate操作的基本流程 使用 Hibernate 进行数据持久化操作,通常有如下步骤: 1.编写持久化类: POJO + 映射文件 2.获取 Configuration 对象 3.获取 ...

  2. Windows server 2008 R2 如何启动任务计划程序

    使用windows server 2008 R2  的任务计划程序需要启动服务 Task Scheduler 服务, windows server 2008 R2 默认状态下Task Schedule ...

  3. sample code java pom.xml

    pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  4. Codeforces Round #371 (Div. 2) C. Sonya and Queries —— 二进制压缩

    题目链接:http://codeforces.com/contest/714/problem/C C. Sonya and Queries time limit per test 1 second m ...

  5. ssh整合 小例子

    实现了用户的查插删改操作. 原理:struts负责接收.分发请求.spring采用面向接口编程的思想整合整体框架,负责连接数据库.hibernate负责操作数据库语言. 思路: 1.配置struts的 ...

  6. PHP截取中英文混合字符

    <?php //////////////////////////////////////////////////////////////////// // PHP截取中英文及标点符号混合的字符串 ...

  7. swoole异步redis安装前置条件和流程

    ---恢复内容开始--- 1.redis服务 确认redis在服务器中已经安装了 2.hiredis库 第二步安装hiredis 下载位置 2.1获取 安装包https://github.com/re ...

  8. DFS序+线段树(bzoj 4034)

    题目链接 题目就不多说了. 本题目,可以用dfs序+线段树做:题目给定了一棵树,树上节点告诉了权值.我们可以先将这棵树进行dfs将一棵树变成线性结构:如图 变成这样后,然后就可以用线段树. 操作1:也 ...

  9. CKEDITOR 默认最大化

    createEditor("newsEditer"); //创建一个editer //editer 最大化 CKEDITOR.instances["newsEditer& ...

  10. 端口扫描程序nmap使用手册

        其实还是建议看英文的man,对以后学习其他东西很有帮助的:) 摘要 nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等 ...