洛谷 P5020 货币系统
洛谷 P5020 货币系统
题目描述
在网友的国度中共有$ n $种不同面额的货币,第 i种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为\(n\)、面额数组为 \(a[1..n]\)的货币系统记作$ (n,a)$。
在一个完善的货币系统中,每一个非负整数的金额 \(x\) 都应该可以被表示出,即对每一个非负整数 \(x\),都存在 \(n\) 个非负整数\(t[i]\)满足 \(a[i] \times t[i]\) 的和为$ x$。然而, 在网友的国度中,货币系统可能是不完善的,即可能存在金额 \(x\) 不能被该货币系统表示出。例如在货币系统 \(n=3\),\(a=[2,5,9]\)中,金额\(1,3\) 就无法被表示出来。
两个货币系统$ (n,a)$和 \((m,b)\) 是等价的,当且仅当对于任意非负整数 \(x\),它要么均可以被两个货币系统表出,要么不能被其中任何一个表出。
现在网友们打算简化一下货币系统。他们希望找到一个货币系统 \((m,b)\),满足$(m,b) $与原来的货币系统 $(n,a) $等价,且 \(m\) 尽可能的小。他们希望你来协助完成这个艰巨的任务:找到最小的 \(m\)。
输入输出格式
输入格式:
输入文件的第一行包含一个整数 \(T\),表示数据的组数。
接下来按照如下格式分别给出 \(T\) 组数据。 每组数据的第一行包含一个正整数 \(n\)。接下来一行包含 \(n\) 个由空格隔开的正整数 \(a[i]\)。
输出格式:
输出文件共有 \(T\)行,对于每组数据,输出一行一个正整数,表示所有与$(n,a) $等价的货币系统 \((m,b)\)中,最小的 \(m\)。
输入输出样例
输入样例#1:
2
4
3 19 10 6
5
11 29 13 19 17
输出样例#1:
2
5
说明
在第一组数据中,货币系统$ (2, [3,10])$和给出的货币系统 $(n,a) $等价,并可以验证不存在 $m < 2 $的等价的货币系统,因此答案为 \(2\)。 在第二组数据中,可以验证不存在\(m<n\) 的等价的货币系统,因此答案为$ 5$。
【数据范围与约定】
对于\(100%\)的数据,满足\(1 ≤ T ≤ 20\), \(n\),\(a[i] ≥ 1\)。
思路
先解释一下样例1中第一组数据的3,10,19,6等价于3,10的原因
6=3+3,19=3+3+3+10
即13,19都可以被凑出来
而第二组中的5个数都不能将其他的数凑出来(或被凑出来)
所以直接输出了5
所以就排序看看能不能凑出来就好啦
a[i]=0表示没有i这个数,a[i]=1表示可以凑出i这个数,a[i]=2表示本身就有i这个数
如果处理完成之后a[1~n]中还有等于2的(即本身就有这个数并且不能凑(只能他凑别人))
就让ans++,最后输出就好了
(nb题目毁我人生,差点没读懂)
(话说现在做的题目的题面都好难懂啊,小小蒟蒻做不出来啊......)
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
#define INF 0x3f3f3f3f
using namespace std;
int a[25001];
int b[101];
int t,n,ans=0;
inline int read() {
char c=getchar();
int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-48,c=getchar();
return x*f;
}
int main() {
//freopen("money.in","r",stdin);
//freopen("money.out","w",stdout);
t=read();
while (t--) {
ans=0;
memset(a,0,sizeof(a));
scanf("%d",&n);
for (int i=1; i<=n; i++) {
b[i]=read();
a[b[i]]=2;//本身就有b[i]这个数;
}
sort(b+1,b+1+n);//从小到大排序
for (int i=1; i<=b[n]; i++) {
if(a[i]>0) {//如果可以凑出i
//那么也可以凑出i+b[j]
for(int j=1; j<=n; j++) {
if(i+b[j]<=b[n])//排序之后,b[n]一定是b数组中最大的数,在这里防止越界
a[i+b[j]]=1;
else break;//越界的话直接退出
}
}
}
for(int i=1; i<=b[n]; i++)
if(a[i]==2) ans++;//统计a[i]==2的个数输出
printf("%d\n",ans);
}
}
洛谷 P5020 货币系统的更多相关文章
- NOIp2018 TG day1 T2暨洛谷P5020 货币系统:题解
题目链接:https://www.luogu.org/problemnew/show/P5020 这道题感觉比较水啊,身为普及组蒟蒻都不费力的做出来了,而且数据范围应该还能大一些,n起码几万几十万都不 ...
- 洛谷P5020 货币系统
题目 题意简化一下就是找题目给定的n个数最多能消掉多少个,我们用个tong[i]来记录i这个数值能不能用小于等于i的货币组合起来,等于1意味着他只能由自己本身的货币组成,等于2说明他可以被其他货币组成 ...
- 洛谷P5020 货币系统 题解 模拟
题目链接:https://www.luogu.org/problem/P5020 这道题目是一道模拟题,但是又有一点多重背包的思想在里面. 首先我们定义一个 vis[i] 来表示和为 i 的情况在之前 ...
- 洛谷 p5020 货币系统 题解
传送门 一个手动枚举能过一半点而且基本靠数学的题目(然而我考试的时候只有25分) 读清题目后发现就是凑数嘛,.... 对啊,就是凑数,怎么凑是重点啊.. 于是就绝望了一小时手动枚举n从1到5的情况 吐 ...
- 洛谷P5020货币系统
题目 这个题打眼看上去可能是一个数论或者DP,其实我们可以简化一下题意,即 给定一个集合\(\alpha\),找到几个数使得这几个数可以拼凑起来这个集合里所有的数,且需要使这些数的个数最小. 这样这个 ...
- noip2018 洛谷 P5020 货币系统
关键: 要使m最小,(m,b)中的数不能用(n,a)中的数表示出来 对于 3 19 10 6 19=10+3+3+3 6=3+3 只有3 和 10 不能被(n,a)中的数表示 所以m=2 只需要 ...
- 洛谷P1474 货币系统 Money Systems
P1474 货币系统 Money Systems 250通过 553提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 母牛们不但创 ...
- 洛谷 P1474 货币系统 Money Systems(经典)【完全背包】+【恰好装满的最大方案数量】
题目链接:https://www.luogu.org/problemnew/show/P1474 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对 ...
- 洛谷 P1474 货币系统 Money Systems
P1474 货币系统 Money Systems !! 不是noip2018的那道题. 简单的多重背包的变式. #include <iostream> #include <cstdi ...
随机推荐
- Win 7 家庭普通版系统升级密钥
VQB3X-Q3KP8-WJ2H8-R6B6D-7QJB7 (高级版)FJGCP-4DFJD-GJY49-VJBQ7-HYRR2 (旗舰版)要先升级到高级版再升级旗舰版,不然(可能)会出错.
- RDIFramework.NET平台代码生成器V3.2版本全新发布(提供下载-免费使用)
回顾V3.1版本更新内容如下: 1.增加对Oracle表创建语句的查看. 2.新增对MySql的代码生成支持. 3.全面重构对多线程的支持,改变以前会无故退出的现象. 本次在V3.1版本的基础上,增加 ...
- 阿里云HBase携X-Pack再进化,重新赋能轻量级大数据平台
一.八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储.持续8年的投入,历经8年双十一锻 ...
- 不能ssh连接ubuntu linux 服务器 secureCRT不能ssh连接服务器 不能远程ssh连接虚拟机的ubuntu linux
我是用的是secureCRT,远程连接我的虚拟机里面的ubuntu 直接报错,连接不上 1,先分别在windows上ipconfig和ubuntu上ifconfig下 互ping一下,是可以ping通 ...
- java中变量的存储位置
1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符 ...
- 第44章 添加新协议 - Identity Server 4 中文文档(v1.0.0)
除了对OpenID Connect和OAuth 2.0的内置支持之外,IdentityServer4还允许添加对其他协议的支持. 您可以将这些附加协议端点添加为中间件或使用例如MVC控制器.在这两种情 ...
- [转]C# 实现Jwt bearer Authentication
本文转自:https://www.cnblogs.com/aishangyipiyema/p/9262642.html 什么是JWT JWT(JSON Web Token), 顾名思义就是在Web上以 ...
- Linux平台安装MongoDB及使用Docker安装MongoDB
一.Linux平台安装MongoDB MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/downlo ...
- jsp基础语言-jsp动作
jsp动作是一组jsp内置的标签,用来控制jsp的行为,执行一些常用的jsp页面动作.通过jsp动作实现使用多行java代码能够实现的效果,即对常用的jsp功能进行抽象与封装. jsp共有七种标准的“ ...
- arcgis api 3.x for js 共享干货系列之一自写算法实现地图量算工具(附源码下载)
0.内容概览 Geometry 地图服务方式实现地图距离以及面积的量算,简单描述 arcgis api 提供的接口类 geometryEngine 实现地图距离以及面积的量算,简单描述 自定义距离以及 ...