CDOJ 1264 人民币的构造

---恢复内容开始---

我们都知道人民币的面值是1、2、5、10,为什么是这个数值呢,我们分析了下发现,从1−10的每个数字都可以由每种面值选出至多一张通过加法和减法(找钱)来构成,(比如:1+2=3,5−1=4,5+1=6,5+2=7,1+2+5=8,10−1=9)

但是实际上,我们只需要1、2、7三种面值就可以组成1−10的每一个数字了

(1+2=3,7−1−2=4,7−2=5,7−1=6,7+1=8,7+2=9,7+1+2=10)

那么现在问题来了,给一个数n,请问最少需要多少种不同的面值就可以构成从1−n的所有数字,注意在构成每一个数字时同种面值不能超过1张。

Input

一个数字n(1<=n<=100000)

Output

一个数字,代表最少需要多少种不同的面值可以构成从1−n的所有数字。

Sample input and output

Sample Input Sample Output
10
3

分析:

事实上题面是有点迷惑人的,因为前三个最佳的面额并不是1,2,7,而是1, 3, 9

1, 2, 7只能表示1-10的数,但1, 3, 9可以表示1-13的数。

我们用A[n]表示第n个面额,用sum[n]表示前n个面额之和,不难看出A[1], A[2]……A[n]能表示的范围为1,2……sum[n]

题目要求面额最小,也就相当于A[1]……A[n]能表示的范围尽可能的大,所以

|-----------A[n]  A[n]+1-----------------------------------------------------------------A[n+1]--------------------------------------------------|

                             |--------------------------sum[n]-------------------------------------|

A[n+1] - sum[n] = A[n] + 1

据此,可以写出代码

 1 #include <cstdio>
 2
 3 using namespace std;
 4
 5 int main() {
 6   int n;
 7   int cnt = 1;
 8   int sum = 1;
 9   int nw = 1;
10   scanf("%d", &n);
11   while (sum < n) {
12     nw = sum*2+1;
13     sum += nw;
14     cnt++;
15   }
16   printf("%d\n", cnt);
17
18   return 0;
19 }

事实上这并不是最简洁的方法,

gdb中观察上面代码,不难发现A[n]为1, 3, 9, 27……

猜想A[n]=3n-1

证明嘛……我再想想。

---恢复内容结束---

时间: 2024-11-03 20:52:02

CDOJ 1264 人民币的构造的相关文章

CDOJ 1133 菲波拉契数制 变直接统计为构造

菲波拉契数制 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 我们定义如下数列为菲波拉契数列: F(1)=1F(1)=1 F(2)=2F(2)=2 F(i)=F(i−1)+F(i−2)(i>=3)F(i)=F(i−1)+F(i−2)(i>=3) 给定任意一个数,我们可以把它表示成若干互不相同的菲波拉契数之和.比如1313有三种表示法 13=1313

BZOJ 1264 基因匹配Match(LCS转化LIS)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1264 题意:给出两个数列,每个数列的长度为5n,其中1-n每个数字各出现5次.求两个数列的最长公共子列. 思 路:首先找出每个数字在第二个数列中出现的位置,对于第一个数列构造出一个新的数列,每个数用这个数在第二个数列中出现的5个位置代替.这样求最长上升子 列.注意的是,在求到每个数(这里指原第一个数列中的每个数)为止的LIS时,替换后的5个数字要先求大的..不清楚的看代码. int a

从找零到人民币面额设计

引子 晚上坐飞机从北京回成都,在机场候机花了23元买了一袋麻辣牛肉干.身上没零钱,就拿了一张100给售货员找零77.突然觉得这件事情太好玩儿了.中国发行的货币有100.50.20.10.5.1这几种面额的纸币.为什么我们的面额要这样设计呢?不这样设计会怎样?假设这几种面额的设计是合理的,那么这些纸币要按照什么样的比例进行发行才能保证我们生活中给100找73的这个看似很简单的事情能够正常进行呢?地球太神奇了. 面额为什么这样设计? 面额的设计会影响我们什么?面额设计的目的目标又是什么?如果我任意设

支付 &amp; 金融 &amp; 人民币国际化

转 [分享]从财务官角度看人民币跨境贸易结算 核心提示:人民币国际化进程中,商业机遇与挑战并存,值得财务官深思. 正当欧元于危机中苦苦挣扎之时,一个新的币种正在悄然崛起.目前,人民币的国际化进程正在缓慢却稳定的进行着,而世界上所有国家和地区的公司财务官,不分行业和地点,也都该开始认真考虑下人民币国际化所带来的影响了. 2008年,中国政府开启了跨境贸易结算机制,走出了人民币国际化的第一步,随后,这一机制所包含的中国公司及其贸易伙伴所在国的数量逐步增多,到2011年8月份,出口商最后的限制也被解除

编译器构造中自底向上的LALR(1)语法分析的语法分析表生成的实现

提示:阅读本文需掌握编译原理的相关基础知识 本文中使用C++语言系统地实现了龙书中LALR(1)语法分析表的构造算法,首先计算增广文法的LR(0)项集族,每一个项集只包含内核项,计算过程中自动生成了LR(0)自动机,该自动机使用基于十字链表存储结构的有向图表示.然后通过确定自发生成和传播的向前看符号算法计算各LR(0)内核项集自发生成的向前看符号(增广文法新增产生式的向前看符号不包括在内)并确定LR(0)内核项集之间向前看符号的传播关系.最后一遍扫描前将为增广文法新增产生式添加向前看符号即输入结

CodeForces 404C Restore Graph (构造)

题意:让人构造一个图,满足每个结点边的数目不超过 k,然后给出每个结点到某个结点的最短距离. 析:很容易看出来如果可能的话,树是一定满足条件的,只要从头开始构造这棵树就好,中途超了int...找了好久. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include

[.net]基元线程同步构造

1 /* 基元线程同步构造 2 用户模式构造: 3 易变构造(Volatile Construct) 4 互锁构造(Interlocked Construct):自旋锁(Spinlock) 乐观锁(Optimistic Concurrency Control,乐观并发控制) 5 内核模式构造: 6 事件构造(Event) 7 信号量构造(Semaphore) 8 互斥体构造(Mutex) 9 */ 10 11 //易变构造,Volatile.Write()之前的所有字段写入操作,必须再该方法调用

C++基础3 类:构造 拷贝 析构函数,

为什么会出现构造函数 与 析构函数 [email protected]:~/c++$ cat main.cpp  #include <iostream> #include <stdlib.h> #include <string.h> using namespace std; class Test { public: void init() { a = 1; b = 2; } private: int a; int b; }; int main() { Test arr[

继承的构造和析构顺序

程序示例 1 #include <iostream> 2 using namespace std; 3 class a 4 { 5 public: 6 a(){cout<<"构造a"<<endl;} 7 ~a(){cout<<"析构a"<<endl;} 8 }; 9 class b 10 { 11 public: 12 b(){cout<<"构造b"<<endl;