[NOIp2018] luogu P5020 货币系统
还在补暑假作业。
题目描述
你有一个由 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]]
这样就可通过此题。设 maxa=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 货币系统的更多相关文章
- Luogu P5020 货币系统
Luogu P5020 货币系统 先把$a$数组排一下序. 从最小的数开始选,显然最小这个数必须选,然后利用完全背包的思想,从$a_i$到最大值筛选一遍,将可以组成的打上标记. 在判断后面的数字时,如 ...
- 背包 || NOIP 2018 D1 T2 || Luogu P5020 货币系统
题面:P5020 货币系统 题解: 显然要求的货币系统是当前货币系统的子集时答案会更优,于是考虑从当前货币系统中删数 一个大数如果能被其他小数表示出来,它就可以去掉 把数据排个序去个重,然后直接背包 ...
- 【数学】【背包】【NOIP2018】P5020 货币系统
传送门 Description 在网友的国度中共有 \(n\) 种不同面额的货币,第 \(i\) 种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为 \(n ...
- 洛谷 P5020 货币系统
题目描述 在网友的国度中共有$ n $种不同面额的货币,第 i种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为\(n\).面额数组为 \(a[1..n]\ ...
- [NOIp2018提高组]货币系统
[NOIp2018提高组]货币系统 题目大意: 有\(n(n\le100)\)种不同的货币,每种货币的面额为\([1,25000]\)之间的一个整数.若两种货币系统能够组合出来的数是相同的的,那我们就 ...
- P5020 货币系统
P5020 货币系统 题解 仔细分析... 这道题其实就是求所给数组中有多少个数字不能被该数组中的数字自由组合表示出来 比如样例1 3,10 不能被该集合里的数字表示出来,所以他们组成目标集合 6=3 ...
- P5020 货币系统 题解
原题链接 简要题意: 求一个长度最小的货币系统与给出的货币系统等价.求这个货币系统的长度.等价的定义详见题目,不再赘述. 本文可能用到一些集合论,请放心食用. 算法一 \(n=2\) 时,只需判断两个 ...
- NOIp2018 TG day1 T2暨洛谷P5020 货币系统:题解
题目链接:https://www.luogu.org/problemnew/show/P5020 这道题感觉比较水啊,身为普及组蒟蒻都不费力的做出来了,而且数据范围应该还能大一些,n起码几万几十万都不 ...
- P5020 货币系统 (NOIP2018)
传送门 BFS解法 显然如果一个面额A可以被其他面额表示出来 那么这个面额A就没用了 且如果A不能被其他面额表示,那么A一定有用(A本身的值只有自己可以表示) 发现面额最大不超过 25000 那么设 ...
随机推荐
- ios 各个手机型号尺寸及分辨率适配
常用宏 // 判断是否是ipad #define isPad ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdio ...
- rocketmq学习(一) rocketmq介绍与安装
1.消息队列介绍 消息队列本质上来说是一个符合先进先出原则的单向队列:一方发送消息并存入消息队列尾部(生产者投递消息),一方从消息队列的头部取出消息(消费者消费消息).但对于一个成熟可靠的消息队列来说 ...
- Linux之vim、压缩与解压缩
终有一种方法适合你!
- 第一次接触WebSocket遇到的坑以及感受
要求用.net写一个服务,然后通过webscoket实现客户端与服务端之间的通信. 第一次知道.net还可以用来写服务,然后问题来了,服务是什么- -..下面图里的就是服务,可以停止暂停和启动. 我要 ...
- [VB.NET Tips]程序的启动和终止
当执行一个VB.NET应用程序时,CLR会把IL翻译成x86指令,并且寻找一个名为Main的方法. 并从该方法开始执行程序.Main方法也称为程序的"入口"(entry point ...
- Spark学习之RDDs介绍
什么是RDDS? RDDS即Resilient distributed datasets(弹性分布式数据集). Spark中,所有计算都是通过RDDs的创建,转换,操作完成的. 一个RDD是一个不可改 ...
- JavaScript之深入对象(一)
在之前的<JavaScript对象基础>中,我们大概了解了对象的创建和使用,知道对象可以使用构造函数和字面量方式创建.那么今天,我们就一起来深入了解一下JavaScript中的构造函数以及 ...
- Qt 做一个类似微信滑动聊天界面的demo
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://www.cnblogs.com/lihuidashen/p/115889 ...
- Kilani and the Game-吉拉尼的游戏 CodeForce#1105d 模拟 搜索
题目链接:Kilani and the Game 题目原文 Kilani is playing a game with his friends. This game can be represente ...
- 报错:ORA-25150:不允许对区参数执行ALERING
alter table 表名 MOVE storage ( next 128 ) ; -- Add/modify columns alter table 表名 add 列名 var ...