还在补暑假作业。

题目描述

你有一个由 NNN 种面值的货币组成的货币系统。定义两个货币系统等价,当且仅当 ∀x∈N∗\forall x\in\N^*∀x∈N∗ 要么同时能被两个货币系统表示,要么同时不能被表示。尝试从 NNN 种面值中删除尽量多种,使得删除后得到的新系统与原系统等价。求新系统的面值种数。

Solution

一种很显然的想法是,比如 {2,3,5}\{2,3,5\}{2,3,5},因为 2+3=52+3=52+3=5,所以每次我想用 555 的时候我都可以用 2+32+32+3 代替,所以 555 是废的。换句话说,如果一个数可以表示成其他若干个数的和,那么这个数应该被删除。

考虑用深度优先搜索实现这一步骤,可以得到 80 分。时间复杂度 O(Tnn)O(Tn^n)O(Tnn)。

#include<cstdio>
#include<cstdlib>
#include<cstring> const int MAXN=110;
const int MAxm=25010; int T,n;
int a[MAXN+10]; int dfs(int x,int y){
if(x<0) return 0;
if(!x) return 1;
int c=0;
for(int i=1;i<=n;++i){
if(!c&&y!=i) c=dfs(x-a[i],y);
if(c) break;
}
return c;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
int ans=n;
for(int i=1;i<=n;++i)
ans-=dfs(a[i],i);
printf("%d\n",ans);
}
}

设 f[i]f[i]f[i] 表示 iii 这个面值是否可以被表示出来。显然,瓶颈就是求解 fff 数组。

考虑使用动态规划优化此过程。先将 aaa 数组排序,然后 ∀a[i]\forall a[i]∀a[i] 有 f[j]=f[j] or f[i−a[j]]f[j]=f[j]\text{ or }f[i-a[j]]f[j]=f[j] or f[i−a[j]]

这样就可通过此题。设 max⁡a=M=25 000\max a=M=25\ 000maxa=M=25 000,则时间复杂度为 O(TM2)O(TM^2)O(TM2)。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm> const int MAXN=110;
const int MAXM=25010; int T,n;
int a[MAXN+10];
int f[MAXM+10]; int dfs(int x,int y){
if(x<0) return 0;
if(!x) return 1;
int c=0;
for(int i=1;i<=n;++i){
if(!c&&y!=i) c=dfs(x-a[i],y);
if(c) break;
}
return c;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
std::sort(a+1,a+n+1);
memset(f,0,sizeof(f));f[0]=1;
int ans=n;
for(int i=1;i<=n;++i){
if(f[a[i]]){
--ans;
continue;
}
for(int j=a[i];j<=a[n];++j)
f[j]=f[j]||f[j-a[i]];
}
printf("%d\n",ans);
}
}

[NOIp2018] luogu P5020 货币系统的更多相关文章

  1. Luogu P5020 货币系统

    Luogu P5020 货币系统 先把$a$数组排一下序. 从最小的数开始选,显然最小这个数必须选,然后利用完全背包的思想,从$a_i$到最大值筛选一遍,将可以组成的打上标记. 在判断后面的数字时,如 ...

  2. 背包 || NOIP 2018 D1 T2 || Luogu P5020 货币系统

    题面:P5020 货币系统 题解: 显然要求的货币系统是当前货币系统的子集时答案会更优,于是考虑从当前货币系统中删数 一个大数如果能被其他小数表示出来,它就可以去掉 把数据排个序去个重,然后直接背包 ...

  3. 【数学】【背包】【NOIP2018】P5020 货币系统

    传送门 Description 在网友的国度中共有 \(n\) 种不同面额的货币,第 \(i\) 种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为 \(n ...

  4. 洛谷 P5020 货币系统

    题目描述 在网友的国度中共有$ n $种不同面额的货币,第 i种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为\(n\).面额数组为 \(a[1..n]\ ...

  5. [NOIp2018提高组]货币系统

    [NOIp2018提高组]货币系统 题目大意: 有\(n(n\le100)\)种不同的货币,每种货币的面额为\([1,25000]\)之间的一个整数.若两种货币系统能够组合出来的数是相同的的,那我们就 ...

  6. P5020 货币系统

    P5020 货币系统 题解 仔细分析... 这道题其实就是求所给数组中有多少个数字不能被该数组中的数字自由组合表示出来 比如样例1 3,10 不能被该集合里的数字表示出来,所以他们组成目标集合 6=3 ...

  7. P5020 货币系统 题解

    原题链接 简要题意: 求一个长度最小的货币系统与给出的货币系统等价.求这个货币系统的长度.等价的定义详见题目,不再赘述. 本文可能用到一些集合论,请放心食用. 算法一 \(n=2\) 时,只需判断两个 ...

  8. NOIp2018 TG day1 T2暨洛谷P5020 货币系统:题解

    题目链接:https://www.luogu.org/problemnew/show/P5020 这道题感觉比较水啊,身为普及组蒟蒻都不费力的做出来了,而且数据范围应该还能大一些,n起码几万几十万都不 ...

  9. P5020 货币系统 (NOIP2018)

    传送门 BFS解法 显然如果一个面额A可以被其他面额表示出来 那么这个面额A就没用了 且如果A不能被其他面额表示,那么A一定有用(A本身的值只有自己可以表示) 发现面额最大不超过 25000 那么设 ...

随机推荐

  1. IDEA 配置Springboot项目热部署

    实现的方式概述 注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟) File-Se ...

  2. JVM性能监视

    1,按照如下图步骤将-XX:PermSize及 -XX:MaxPermSize的值修改到足够小,故意造项目启动报错,我设置为32m.然后保存. 2.在IDE中启动tomcat的同时打开dos窗口,使用 ...

  3. 论文阅读 | DeepDrawing: A Deep Learning Approach to Graph Drawing

    作者:Yong Wang, Zhihua Jin, Qianwen Wang, Weiwei Cui, Tengfei Ma and Huamin Qu 本文发表于VIS2019, 来自于香港科技大学 ...

  4. 给Xshell增加快速命令集

    一.显示快速命令栏 二.配置快速命令集 在工具中找到快速命令集 添加快速命令集 三.使用快速命令集

  5. elastic集群单节点停机维护

    为了elastic时时提供服务,需要elastic至少状态维持在yellow状态.所有,维护时需要依次对elastic单个节点进行维护. 操作步骤如下: 1.停止elastic的自动分配功能 curl ...

  6. 网站开发过程中的URL写法

    在开发网页和服务器时发现,在很多地方需要写超链接 那么可以将超链接的使用者分为服务器和浏览器,以区分不同的写法 地址可能使用的情况: 1.跳转 2.转发 3.服务器资源地址 4.浏览器超链接 impo ...

  7. 2015年蓝桥杯java b组第十题

    10. 生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a ...

  8. mysql修改数据库的存储引擎(InnoDB)

    查看当前的存储引擎 show engines; 基本的差别:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不 ...

  9. Java源码跟踪阅读技巧

    转:https://www.jianshu.com/p/ab865109070c 本文基于Eclipse IDE 1.Quick Type Hierarchy 快速查看类继承体系. 快捷键:Ctrl ...

  10. 读《深入理解Elasticsearch》点滴-过滤器

    1.过滤器不影响文档得分 2.过滤的唯一目的是用特定筛选条件来缩小结果范围:而查询不仅缩小结果范围,还会影响文档的得分 3.过滤器运行更加高效(因为不用计算得分) 4.通常过滤器使用Bits接口,返回 ...