CSDN同步

原题链接

简要题意:

求一个长度最小的货币系统与给出的货币系统等价。求这个货币系统的长度。等价的定义详见题目,不再赘述。

本文可能用到一些集合论,请放心食用。

算法一

\(n=2\) 时,只需判断两个数的倍数关系。有倍数关系则答案为 \(1\),否则为 \(2\).

时间复杂度:\(O(T \times n)\).

实际得分:\(15pts\).

算法二

\(n=3\) 时,首先,如果两个数都是另一个数的倍数,那么答案为 \(1\).

否则,如果仍存在倍数关系,则答案为 \(2\).

其余的情况,只需要考虑,最小的数和次小的数能否表示出最大的数。

能则为 \(2\),否则为 \(3\).

这里有很多种方法判断。比如:

  1. 暴力,用桶直接来,\(O(\max a_i)\).

  2. 考虑解方程,用 \(\texttt{exgcd}\) 写,\(O(\log \max a_i)\).

总之,时间复杂度为 \(O(T \times n \times (\max a_i))\). (无需优化,因为没有必要)

实际得分:\(30pts\).

算法三

首先,假设给出 \(S\),答案为 \(T\). 则必有:

\[T \in S
\]

下面来证明这个结论。

如果 \(T \not \in S\),则考虑取出 \(x = \min (i \in S)\),\(y = \min(i \in T)\).

如果 \(x<y\),则 \(x\) 无法被表示。

如果 \(y>x\),则 \(y\) 无法被表示。

如果 \(x=y\),那么不断递归下去,得证。

所以,我们只需要在给出的货币系统中寻找答案即可。

这里我们枚举选的答案,然后一一验证。

时间复杂度:\(O(2^n \times n \times (\max a_i) \times T)\),可以通过。

实际得分:\(65pts\).

算法四

注: \(n = 25\),本人没有想到什么可以 \(O(2^n \times T)\) 过掉的算法,因此这一档部分分可能是用来给选手瞎搞的。???

你发现不需要一一枚举。首先你排序一下。

你只要用当前已有的数,判断当前正在决策的这个数能否被表示出。

能,那么说明这个数没有必要,把它抛弃。

否则,肯定要选。只是因为,\(>\) 它的数表示不出,而 \(<\) 也表示不出,只有它自己能表示自己,所以必须选。

那么,这样我们可以唯一确定一个数是否被选。(排序后从小到大选)

如何判断?

我们发现,每次新加入一个数 \(x\) ,我们需要维护能判断出的桶。

此时,可以在原有的桶上,对每个能表示出的数 \(k\),把 \(k+x , k+2x,k+3x \cdots k+ \infty x\) 全部标为可以判断。这是显然的。

至于 \(\infty\) 的上限,只要标到 \(\max a_i\) 即可,因为后面的数没有用了。

时间复杂度:\(O(n \times T \times (\max a_i))\).

实际得分:\(100pts\).

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std; const int N=5e4+1; inline int read(){char ch=getchar();int f=1;while(ch<'0' || ch>'9') {if(ch=='-') f=-f; ch=getchar();}
int x=0;while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;} int T,n,a[N];
int cnt=0;
int maxi; bool h[N]; int main(){
T=read(); while(T--) {
n=read(); maxi=0; cnt=0;
memset(h,0,sizeof(h)); //初始化
for(int i=1;i<=n;i++) a[i]=read(),maxi=max(maxi,a[i]);
sort(a+1,a+1+n); //排序
for(int i=1;i<=n;i++)
if(!h[a[i]]) { //不能被表示
h[a[i]]=1; cnt++;
for(int j=1;j<=maxi;j++)
if(h[j]) {
for(int k=a[i];j+k<=maxi;k+=a[i])
h[j+k]=1;
} //维护能被表示的桶
} printf("%d\n",cnt);
}
return 0;
}

P5020 货币系统 题解的更多相关文章

  1. 洛谷P5020 货币系统 题解 模拟

    题目链接:https://www.luogu.org/problem/P5020 这道题目是一道模拟题,但是又有一点多重背包的思想在里面. 首先我们定义一个 vis[i] 来表示和为 i 的情况在之前 ...

  2. 洛谷 p5020 货币系统 题解

    传送门 一个手动枚举能过一半点而且基本靠数学的题目(然而我考试的时候只有25分) 读清题目后发现就是凑数嘛,.... 对啊,就是凑数,怎么凑是重点啊.. 于是就绝望了一小时手动枚举n从1到5的情况 吐 ...

  3. P5020 货币系统

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

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

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

  5. 洛谷 P5020 货币系统

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

  6. Luogu P5020 货币系统

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

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

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

  8. [NOIp2018] luogu P5020 货币系统

    还在补暑假作业. 题目描述 你有一个由 NNN 种面值的货币组成的货币系统.定义两个货币系统等价,当且仅当 ∀x∈N∗\forall x\in\N^*∀x∈N∗ 要么同时能被两个货币系统表示,要么同时 ...

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

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

随机推荐

  1. 通过ELK快速搭建集中化日志平台

    ELK就是ElasticSearch + LogStash + Kibana 1.准备工作 ELK下载:https://www.elastic.co/downloads/ jdk version:1. ...

  2. 获取网站title的脚本

    脚本在此 公司的商城需要添加一个脚本,这个脚本就是观察首页页面是否正常,虽然已经配置了zabbix监控网站是否200,但是有一些特殊的情况,比如网页可以打开但是页面是"file not fo ...

  3. WiFi产生电磁辐射或让人想去自杀

    随着互联网在生活中的地位越来越重要,WiFi作为一种无线连接方式给了用户极大的便捷,然而有一部分科学家提出WiFi产生的电磁反应会对人的健康受到影响.面对这种说法,我们一直以为是专家在危言耸听,但是如 ...

  4. mysql长连接与短连接

    什么是长连接? 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态. 通常的短连接操作步骤是: 连接->数据传输->关闭连接: 而长连接通常就是: 连接-> ...

  5. C++走向远洋——24(项目一,三角形,复制构造函数)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanjiaoxing.cpp * 作者:常轩 * 微信公众号: ...

  6. C++走向远洋——57(项目二2、动物这样叫、抽象类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  7. 7——PHP选择结构

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  8. python 实现各种进度条

    1. 时间进度条 class Tiao(object): def __init__(self): self.obj1 = datetime.timedelta(seconds=1) self.var ...

  9. 利用机器学习检测HTTP恶意外连流量

    本文通过使用机器学习算法来检测HTTP的恶意外连流量,算法通过学习恶意样本间的相似性将各个恶意家族的恶意流量聚类为不同的模板.并可以通过模板发现未知的恶意流量.实验显示算法有较好的检测率和泛化能力. ...

  10. 丰富图文详解B-树原理,从此面试再也不慌

    本文始发于个人公众号:TechFlow,原创不易,求个关注 本篇原计划在上周五发布,由于太过硬核所以才拖到了这周五.我相信大家应该能从标题当中体会到这个硬核. 周五的专题是大数据和分布式,我最初的打算 ...