BZOJ3233: [Ahoi2013]找硬币

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3233

多一点硬币是没有关系的,不用就行了。

然后有一个dp,f[i]=min(f[j]-∑a[k]/i* (i/j-1) )

然后只要枚举i的质因子就可以了。(先线性筛出最大的质因子。。

#include<cstring>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define low(x) (x&(-x))
#define maxn 100500
#define inf int(1e9)
#define mm 1000000007
#define ll long long
using namespace std;
int a[maxn],mn[maxn],pri[maxn],b[maxn],f[maxn],tot,ans,n,mx;
ll read(){
    ll x=0,f=1; char ch=getchar();
    while (!isdigit(ch)) {if (ch==‘-‘) f=-1; ch=getchar();}
    while (isdigit(ch)) {x=x*10+ch-‘0‘; ch=getchar();}
    return x*f;
}
void getpri(){
    rep(i,2,100000) {
        if (!b[i]) b[i]=1,mn[i]=i,pri[++tot]=i;
        rep(j,1,tot) if (i*pri[j]<=100000) {
            b[i*pri[j]]=1; mn[i*pri[j]]=pri[j];
            if (i%pri[j]==0) break;
        } else break;
    }
}
int main(){
    getpri();
    n=read();
    rep(i,1,n) a[i]=read(),mx=max(a[i],mx),f[1]+=a[i];
    rep(i,1,mx) f[i]=f[1]; ans=f[1];
    rep(i,2,mx) {
        int x=i;
        while (x>1){
            int t=f[i/mn[x]];
            rep(j,1,n) t-=a[j]/i*(mn[x]-1);
            f[i]=min(f[i],t);
            if (mn[x]==mn[x/mn[x]]) x/=mn[x];
            x/=mn[x];
        }
        ans=min(ans,f[i]);
    }
    printf("%d\n",ans);
    return 0;
} 
时间: 2024-10-12 21:08:44

BZOJ3233: [Ahoi2013]找硬币的相关文章

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

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

【BZOJ 3233】 [Ahoi2013]找硬币

3233: [Ahoi2013]找硬币 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 486 Solved: 198 [Submit][Status][Discuss] Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3- 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125,250就是一组合法的硬币序列,而1,5,100,125就不是.不知从哪一天开始,可爱的蛇

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

Description 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3… 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125,250就是一组合法的硬币序列,而1,5,100,125就不是.不知从哪一天开始,可爱的蛇爱上了一种萌物——兔纸!从此,小蛇便走上了遇上兔纸娃娃就买的不归路.某天,小蛇看到了N只可爱的兔纸,假设这N 只兔纸的价钱分别是a1,a2…aN.现在小蛇想知道,在哪一组合法的硬币序列下,买这N只兔纸所需要的硬币数最少

BZOJ 3233 Ahoi2013 找硬币 动态规划

题目大意:给定n个数,求一种混合进制使得每个数各个位之和之和最小 令fi表示表示最大硬币面值为i时零头部分(即ak mod i部分)的最小硬币数 那么有转移方程:fj=min{fi+∑nk=1?ak mod ji?}(i|j) 然后ans=min{fi+∑nk=1?aki?} 时间复杂度O(nmlogm),光荣TLE 优化:ji一定是质数,否则我可以多添加一种硬币而不伤身体(雾 那么我们只需要枚举质数倍数即可 时间复杂度O(nmloglogm),这样就可以过了 #include <cstdio>

利用动态方法修正贪婪算法中找硬币的问题

在博文:http://blog.csdn.net/qiwsir/article/details/31375449 中,讲述了如何用贪婪算法解决找硬币的问题,同时也指出了该方法存在的问题. 如何解决? 下面就是一个解决方案,在这里采用的是动态算法. def coinChange(centsNeeded, coinValues): minCoins = [[0 for j in range(centsNeeded + 1)] for i in range(len(coinValues))] minC

找硬币

时间限制: 1 Sec  内存限制: 64 MB 题目描述 小蛇是金融部部长.最近她决定制造一系列新的货币.假设她要制造的货币的面值为x1,x2,x3- 那么x1必须为1,xb必须为xa的正整数倍(b>a).例如 1,5,125,250就是一组合法的硬币序列,而1,5,100,125就不是.不知从哪一天开始,可爱的蛇爱上了一种萌物--兔纸!从此,小蛇便走上了遇上兔纸娃娃就买的不归路.某天,小蛇看到了N只可爱的兔纸,假设这N 只兔纸的价钱分别是a1,a2-aN.现在小蛇想知道,在哪一组合法的硬币序

联赛之前的题表(已完成)汇总(可能有遗漏)

联赛之前的搞搞(其实是懒得分类) 博弈论 poj3537 poj1704 hdu5996两个插头 HDU1693 Eat the Trees COGS1283. [HNOI2004] 邮递员kdtree板子1941: [Sdoi2010]Hide and Seek旋转卡壳 pj2187凸包 cogs896 bzoj2829 信用卡凸包莫比乌斯反演基础 bzoj 4173 zhao gui lv bzoj 3529 mobiwus bzoj 4407 mobiwus bzoj 2818 mobiw

找换硬币问题 与 0-1背包问题区别

之所以再写一篇Blog,是因为现实中很多问题都可以转化成“找换硬币”问题 和 “0-1”背包问题.因此,需要细细理解. 其次,在“参考资料”中汇总关于 贪心算法与动态规划的一些Blog及学习资料. 区别: 其实最大的区别就是:找换硬币问题中的 某类硬币 是可以多次选择的.而对于0-1背包问题,某物品要么选,要么不选,选了之后,它就“没了”.当然,有0-1背包问题的变形--完全背包问题--某(某类)物品有多个,可重复选. 第二,就是选择的权衡.0-1背包问题,还有个价值属性,在选择的时候,是考虑价

一些奇奇怪怪的过题思路

最近考了几次试,做完之后发现自己还是缺乏思维精度和深度--在此把一些奇怪的思路记下来-- 随 题意大概就是拿了一堆数取来取去,这些数在一个模数意义下做乘法,求出操作后取值的期望. 首先,找到这个模数的原根(鬼知道为什么现在出来了),然后就把这些乘法变成加法,然后就是矩阵一通乱搞-- 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using