UESTC__ACM 1264 人民币的构造
链接地址:https://acm.uestc.edu.cn/contest/198/problem/J
我们都知道人民币的面值是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=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=101+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张。
Standard Input
一个数字n(1<=n<=100000)、
Standard Output
一个数字,代表最少需要多少种不同的面值可以构成从1~n的所有数字。
Samples
| Input | Output |
|---|---|
|
|
| Time Limit | 1000 ms |
| Memory Limit | 64 MiB |
| Output Limit | 64 MiB |
题解与思路:
方法一思路:将该题的实质转化为三进制问题,如果加面额则为+1,减去面额则为-1,不用该面额的纸币则为0;所以n张纸币则有3n种情况(打个比方:如果有两张纸币,则状态共有0 0,1 0,-1 0,0 1,1 1,-1 1,0 -1,1 -1,-1 -1共9种),首先很明显能除去n张纸币状态全为0的情况,剩余3n-1种情况,剩余情况中有一半面额之和为负。举个例子:目前有两张纸币面额分别为1,3,则有32-1=8种情况,即1+0=1 , 3-1=2 , 3+0=3 , 3+1=4 , -1+0=-1 , 1-3=-2 , -3+0=-3 , -1+(-3)=-4,可以看出,正数情况和负数情况是相等的,所以正情况一共有3n-1/2种
疑问:正情况只代表了最大值和最小值的取值范围,怎么能够证明出这个范围区间内的所有值都能取到?
证明:利用数学归纳法,很明显,k=1时明显成立(1元最少只用一张纸币,纸币面额为1),k=3时,能表示[1~4]的所有面额,表示的最大数刚好为正情况的最多种数(即3n-1/2种),假设k=n-1时也成立(纸币面额为1,3,9······3n-2)此时n-1张纸币能表示的范围为[1~3n-1-1/2],当k=n时(纸币面额为1,3······3n-1即新增加的面额为3n-1),新增加的表示范围为[3n-1+1/2~3n-1/2]=>证明1:因为k=n-1时所能表示的正范围为[1~3n-1-1/2],由上面的思路可得,负数和正数的情况是对称的,所以能表示的全范围应该是[-(3n-1-1/2)~3n-1-1/2],此时加上一个新的数3n-1,则将整个区间向前位移3n-1
得新增加的区间[3n-1+1/2~3n-1/2]。此时将新增加的区间和原区间进行合并可得k=n所能表示的区间为[1~3n-1/2](3n-1/2不是整数!),故得证;
方法二思路:不妨设目前能表示的范围为[1~M],此时增加一个数Q>M,由上面证明中的证明1可得,新增加的可表示范围为[Q-M~Q+M],要使得增加一个数Q后的区间所能表示的范围更大,并且区间连续无中断,即Q-M=M+1 => Q=2*M+1,所以增加Q后的最大表示范围为[1~3*M+1],由于我们能知道当人民币面额为1时所能表示的区间为[]1~1],此时只要区间最大值M不超过n,则可以增加一个数Q,使得区间最大值变为3*M+1,直到n包含在区间内;
方法二的实现代码如下:
#include<iostream>
using namespace std;
int main(){
int n,max=1,count=1;
cin>>n;
if(n==1)
cout<<count<<endl;
else
{
while(max<n)
{
max=3*max+1;
count++;
}
cout<<count<<endl;
}
return 0;
}
UESTC__ACM 1264 人民币的构造的更多相关文章
- CDOJ 1264 人民币的构造 区间问题+数论
人民币的构造 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status ...
- UESTC--1264--人民币的构造(数学规律)
人民币的构造 Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %lld & %llu Submit Status D ...
- CDOJ 第七届ACM趣味程序设计竞赛第三场(正式赛) 题解
宝贵资源 题目连接: http://acm.uestc.edu.cn/#/problem/show/1265 题意 平面上给n个点(n<=1000),要求找一个面积最小的正方形,将所有的点都囊括 ...
- 学习笔记:Maven构造版本号的方法解决浏览器缓存问题
需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...
- 一步步构造自己的vue2.0+webpack环境
前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...
- Bootstrap人民币玩家攻略
用bootstrap及其它基于它的框架,做了多次网站大改版~对bootstrap的特点有了越来越深的了解~从一开始接触时觉得超级鸡肋,到后来觉得方便,再到后来觉得还是能不用就别用了~为什么这么说?我们 ...
- About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷
构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...
- Eos开发——构造查询条件
1.ajax 方式 var data = { orgid :orgid,year:year ,month: month,type:type,sortField:'sellEmpname' ,sortO ...
- 返回人民币大写方式(num2rmb)
CREATE OR REPLACE FUNCTION num2rmb(Pi_MONEY NVARCHAR2) RETURN NVARCHAR2 IS -- PURPOSE :返回人民币大写方式 v_N ...
- 【C++】类和对象(构造与析构)
类 类是一种抽象和封装机制,描述一组具有相同属性和行为的对象,是代码复用的基本单位. 类成员的访问权限 面向对象关键特性之一就是隐藏数据,采用机制就是设置类成员的访问控制权限.类成员有3种访问权限: ...
随机推荐
- Arduino教程目录
目录 第一节.安装Arduino开发环境 第二节.第一个HelloWorld 第二节续.LED操作 呼吸灯 流水灯 正在加快制作,大家可以先看下面的视频了解基本语法,我准备基础课程和实际项目结合讲解. ...
- 链表反转,C++实现
1 // To Compile and Run: g++ invert_list.cc -std=c++11 -Wall -O3 && ./a.out 2 3 4 #include & ...
- Ubuntu常用环境配置
gcc sudo apt-get install build-essential update-alternatives 管理python环境 # 添加版本 # update-alternatives ...
- flask-script的简单使用
1.Flask-Script介绍Flask-Script的作用是可以通过命令行的形式来操作Flask.Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定 ...
- Selenium常见方法
1.打开和关闭浏览器 打开浏览器 driver=webdriver.Ie() driver=webdriver.Chrome() driver=webdriver.Firefox() ...
- data location nextcloud
/var/snap/nextcloud/common/nextcloud/data/ Adding files to Nextcloud using the command line https:// ...
- [Windows] Visual Studio 类库Xml文档免费翻译工具 《Xml文档翻译器2.1》
谷歌Chrome翻译功能失效用不了,我们一起来恢复翻译功能! 可用的谷歌国内 IP: 142.250.4.90 translate.googleapis.com 142.250.30.90 trans ...
- 7 Free Energies: 7.4 Umbrella Sampling Example
7.4 Umbrella Sampling Example计算丙氨酸二肽 Phi/Psi 旋转的 PMF http://ambermd.org/tutorials/advanced/tutori ...
- python中的反射机制
转自https://www.cnblogs.com/renjie1105/p/15909285.html python反射简介 在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需 ...
- GameObject.Find()、Transform.Find()查找游戏对象
GameObject.Find 按广度进行查找 GameObject.Find("GameObject"); GameObject.Find("GameObject/Ch ...