BZOJ 4265 货币系统
今天比赛的时候做到的。题解写得很简单,但是感觉对于我这种蒟蒻还是很有思考的价值的。
题面(由于题面很短,就不概括了):小Q当上了新的宇宙大总统,他现在准备重新设计一套货币系统。
这道题(权限题),拿到的时候给人一种隐约的背包感。数据范围让小蒟蒻我想到DP+矩阵乘法/二分。然而这些都只是YY,我们仔细分析一下题面,可以先将其简(fu za)化为以下这个问题(ki∈{2,3,4,5},ai∈N*):
n=1*(a1+k1*(a2+k2*(a3+k3*(a4+k4*a5)))) 求出min(a1+a2+a3+a4+a5) (为了方便叙述,取m=5讨论)
这个还是比较好理解的。5个面值分别为1,k1,k1*k2,k1*k2*k3,k1*k2*k3*k4,5个面值各取a1,a2,a3,a4,a5张,把这个式子拆开就可以证明其正确性。然后我们可以得到,a2=(m-a1)/k2,后面的a3,a4,a5也是同理。
然后到这里小蒟蒻卡了一下。
反着考虑。假设我们已经得到所有货币的面值,肯定是从大到小贪心地取。因为 货币i 的一张等同于ki-1张 货币i-1 ,所以ai-1<ki-1 。因此,我们可以枚举ki,然后倒过来将n· 对ki的余数(也就是ai)计入答案,再将n·除以ki得到下一个n· ,直到除的次数(即k)用完。
因此,我们可以得到下面这个会T的算法(也就是小蒟蒻考试的时候上交的算法):
#define ll long long
ll n;
int k;
ll dfs(ll xz,int cs){//xz表示当前值,cs表示还剩多少次
if(xz==)return ;
if(cs==)return xz;
ll mi=1e18,ans;
for(ll i=;i<=;i++){
ans=dfs(xz/i,cs-)+xz%i;
if(ans<mi)mi=ans;
}
return mi;
}
int main(){
scanf("%lld%d",&n,&k);
printf("%lld",dfs(n,k));
}
然后我就T了……
T了……
事实上,只要用map记忆化就可以了……怎么说呢……被自己蠢到了……
AC代码如下:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n;
int k;
map<ll,ll>m[];
ll dfs(ll xz,int cs){
if(m[cs].count(xz))return m[cs][xz];
if(xz==)return ;
if(cs==)return xz;
ll mi=1e18,ans;
for(ll i=;i<=;i++){
ans=dfs(xz/i,cs-)+xz%i;
if(ans<mi)mi=ans;
}
return m[cs][xz]=mi;
}
int main(){
scanf("%lld%d",&n,&k);
printf("%lld",dfs(n,k));
}
以此篇博客为戒,多存套路,少犯智障错误。
BZOJ 4265 货币系统的更多相关文章
- 洛谷P1474 货币系统 Money Systems
P1474 货币系统 Money Systems 250通过 553提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 母牛们不但创 ...
- 【USACO 2.3.4】货币系统
[描述] 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单 ...
- NOIP2018Day1T2 货币系统
题目描述 在网友的国度中共有 \(n\) 种不同面额的货币,第 \(i\) 种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为 \(n\).面额数组为 \( ...
- 洛谷 P5020 货币系统
题目描述 在网友的国度中共有$ n $种不同面额的货币,第 i种货币的面额为 \(a[i]\),你可以假设每一种货币都有无穷多张.为了方便,我们把货币种数为\(n\).面额数组为 \(a[1..n]\ ...
- luogu5020 [NOIp2018]货币系统 (完全背包)
我那个新的货币系统,就是把原来的货币系统中能被其他数表示的数删掉 那我就算有多少数能被别的数表示,那肯定是要被比它小的表示 于是排个序做完全背包就好了 但是我太zz不会完全背包,然后写了个bitset ...
- [NOIp2018提高组]货币系统
[NOIp2018提高组]货币系统 题目大意: 有\(n(n\le100)\)种不同的货币,每种货币的面额为\([1,25000]\)之间的一个整数.若两种货币系统能够组合出来的数是相同的的,那我们就 ...
- P1474 货币系统 Money Systems(完全背包)(大水题)
题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单 ...
- 洛谷 P1474 货币系统 Money Systems(经典)【完全背包】+【恰好装满的最大方案数量】
题目链接:https://www.luogu.org/problemnew/show/P1474 题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对 ...
- P1474 货币系统 Money Systems
题目描述 母牛们不但创建了它们自己的政府而且选择了建立了自己的货币系统.由于它们特殊的思考方式,它们对货币的数值感到好奇. 传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单 ...
随机推荐
- 小白的首个maven web项目Step1软件安装一(jdk的下载配置和eclipse的安装)
因为电脑太卡加了一个固态硬盘导致系统重装, 把之前的C盘和D盘合并成一个盘,这下之前下的杂七杂八的软件应该差不多都清干净了. 申请这个博客是想记录最近写项目学习的一些事,系统重装之后,发现自己都已经忘 ...
- Python filter() 函数
Python filter() 函数 描述 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为 ...
- win10下运行cmd闪退时检查方法
在cmd下运行 exe加空格加斜杠加问号
- Python Day2 Learning record
一.python初始化模块 Python的强大之处在于他有非常丰富和强大的标准库和第三方库 ...
- hive批量删除表
#!/bin/shhive -e "use csxuy;show tables;"|grep product_tour2 | while read linedoecho -n &q ...
- WebSocket对象的“readyState”属性记录连接过程中的状态值
websocket的两个属性:readyState和bufferedAmount. 根据readyState属性可以判断webSocket的连接状态,该属性的值可以是下面几种: 0 :对应常量CONN ...
- NIO 概述 与 通信实例
NIO 简述: NIO是在jdk1.4之后加入的一种基于缓冲区(buffer)和通道(channel)的I/O方式, nio是同步非阻塞的i/o模式,同步是指线程不断地轮询i/o事件,非阻塞是在处理i ...
- 使goroutine同步的方法总结
前言: 在前面并发性能对比的文章中,我们可以看到Golang处理大并发的能力十分强劲,而且开发也特别方便,只需要用go关键字即可开启一个新的协程. 但当多个goroutine同时进行处理的时候,就会遇 ...
- 关于while read line 循环中变量作用域的问题
前一阵用shell写了一个从数据库中抽取数据生成.xml文件的脚本,要求是每个文件中只生成1000条数据.于是用到了while read line 作为循环. 在制作文件计数器的时候发现了一个问题,在 ...
- oracle 根据一个表生成另一个新表和一个现有表给一个新的表赋值
1,添加表B ,和A表表结构相同(带数据) create table B as select * from A; 2,添加表B ,和A表表结构相同(不带带数据) create table B as ...