首页 > 其他分享 >洛谷P5020题解

洛谷P5020题解

时间:2022-10-22 20:56:30浏览次数:102  
标签:洛谷 int 题解 面值 货币 lim P5020 面额 include

原题

P5020 [NOIP2018 提高组] 货币系统


思路概述

题意分析

给定包含一个整数 \(n\) 和一个正整数集合 \(a\) 的货币系统 \((n,a)\),要求将其化简,输出最简的货币系统中的面值数量。其中,化简在货币系统 \((n',a')\) 中,任意被原货币系统 \((n,a)\) 表示出的面值都能被表示,任意不能被原货币系统表示的面值相应地不能被表示;最简即 \(n'\) 最小。

思路简述

死去的小凯开始攻击我。

乍一看有点像小凯的疑惑这道题,但是本题的思路与其有一定差别。

由于要求使简化结果中 \(n'\) 尽量小,所以不难知道,若原整数集合中出现 \(\exists a_i∈a,a_i={k_1a_1+k_2a_2\dots k_{i-1}a_{i-1}}\) 的情况,就可以将 \(k\) 约去。

因此只需要枚举上述能被约去的面值,即可得到最简的货币系统。


算法实现

关于枚举

由于本题数据规模是 \(1≤a_i≤25000\),所以可以采用类似质数筛的线性标记法。需要注意的是,区别于质数筛,本题需要从一个已经可以凑出的面额上再累加枚举的面值,即:

\[\exists v_i=1⇒v_{i+kj}=1(k∈N,j∈a) \]

当出现当前选定的面额 \(i\) 出现 \(v_i=1\) 的情况,则说明 \(i\) 是可以被简化的面额,因此减小 \(n'\)。

关于标记

特殊地,由于所有面额的货币数量均为 \(0\) 时,可以凑出面额 \(0\),因此标记数组初始化时就需要令 \(v_0=0\)。


AC code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<set>
#include<ctime>
#define RI register int
using namespace std;
const int maxn=1e2+10,maxsize=5e5+10;
int T,n,lim,ans;
int a[maxn];
bool v[maxsize];
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	for(cin >> T;T;--T)
	{
		memset(v,0,sizeof(v));
		cin >> n;ans=n;lim=0;
		for(RI i=1;i<=n;++i) 
		{
			cin >> a[i];
			lim=max(lim,a[i]);
		}
		sort(a+1,a+n+1);
		v[0]=1;
		for(RI i=1;i<=n;++i)
			if(!v[a[i]])
			{
				for(RI j=0;j<=lim;++j)
					if((!j) || (v[j]))
						for(RI k=1;j+a[i]*k<=lim && !v[j+a[i]*k];++k)
							v[j+a[i]*k]=1;
			}
			else --ans;
		printf("%d\n",ans);
	}
	return 0;
}

标签:洛谷,int,题解,面值,货币,lim,P5020,面额,include
From: https://www.cnblogs.com/frkblog/p/16817262.html

相关文章

  • P4679 题解
    前言题目传送门!更好的阅读体验?大力树剖!做树剖时,大家可以膜拜@liruiduan2巨佬,他可以在考场上码200行的树剖题目。思路代码有点长。可以用这份代码对拍。/*树剖......
  • P2218 题解
    前言题目传送门!更好的阅读体验?二分答案套搜索。思路答案显然具有单调性,于是可以二分答案。问题是如何实现\(\operatorname{check}(k)\)函数(\(k\)指薄膜边长)。其......
  • 洛谷P2827题解
    原题P2827[NOIP2016提高组]蚯蚓思路概述题意分析给定整数\(n,m,q,u,v,t\)和一个数列\(\{a\}\),进行\(m\)次操作如下:每次选取其中最大数\(x\)切分为\([px],x......
  • dremio 21 版本之后反射No File System scheme matches 问题解决
    实际属于一个老问题了,整理下,方便使用,主要是我们在使用反射的时候碰到的问题问题如下UnknownFormatConversionException:Conversion='Unknownformat(pdfs)conversio......
  • CodeForces-1143#C 题解
    正文♦时间复杂度:\(\mathcal{O}(n)\)思维题,不需要建树。设数组\(a\)记录每一个节点是否尊重它的父节点,数组\(b\)记录是否有节点尊重它,特别的,叶子节点必然不被尊重。......
  • [题解]如何求连续区间最大和
    给一个数列,有正有负,如何求最大的连续区间和?需要设f数组表示每个位置为结尾的最大区间和能否让f[i]等于f[i-1]+a[i]要看这样的f[i]是否大于零如果大于0,就说明它仍然可以......
  • 「题解」洛谷 P8529 [Ynoi2003] 赫露艾斯塔
    构造半平面莫队?/jk注意到对于一个半平面的直线,通过平移和旋转经过的点数,一定大于等于它们的对称差,因为对称差中的点会被经过奇数次,不在对称差中的点会被经过偶数次。那么......
  • ABC266 ~ 273 题解
    缺省源#pragmaGCCoptimize(3)#include<bits/stdc++.h>namespace//tofoldthatjunkcode{#definefilein(x){freopen(x".in","r",stdin);}#definefile(......
  • Fabricating Sculptures 题解
    草草地写一篇题解,废话不多说暴力要拼成“^”型,考虑\(DP\)令\(f_{i,j}\)表示,总共有\(i\)个积木,其中底座占了\(j\)个积木,也就是说你还有\(i-j\)个积木来拼底座的......
  • CF1716C Robot in a Hallway题解
    \(2000\)分的DP题。题意给定一个\(2\)行\(n\)列的网格。机器人初始坐标为\((0,1)\),每一秒都可以向四周移动。每个格子有解锁时间,在该时间之前机器人不可以进入该......