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种访问权限: ...
随机推荐
- base64与中文字符串互转
实现代码如下 // 字符串转base64 getEncode64(str){ return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g ...
- leetcode 1636
一些关于hashmap和list的用法 class Solution { public int[] frequencySort(int[] nums) { Map<Integer, Intege ...
- springboot 日志处理
引言 springboot框架集成logback日志 logback是由log4j创始人设计的又一个开源日志组件.目前,logback分为三个模块:logback-core,logback-class ...
- redis事务和锁机制、持久化操作RDB/AOF
一.Redis事务介绍 Redis事务是一个单独的隔离操作 :事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.Redis事务的主要作用就是串联多个 ...
- CentOS7 yum方式安装mysql 5.7
1.检查服务器上有没有安装mysqlyum安装方式:yum list installed mysql*yum卸载 yum remove 已安装的包卸载完安装包后,删除安装文件rm -rf /var/l ...
- CMMI的软件工程13-16章读书笔记
一.软件测试 软件测试是为了发现程序中的错误而执行的过程.测试只能证明软件有错,而不能保证软件程序没错. 1. 软件版本 Alpha版 公司内测版本 Beta版 对外公测版本 发布版 正式发布版本 ...
- Ubuntu常用命令(二)
clash 启动 #.clash -d . sudo /home/lizhenyun/clash/clash -d /home/lizhenyun/clash/ deb包安装 sudo dpkg -i ...
- 10、jmeter的 Http的请求默认值
在我们测试过程当中,有很多HTTP协议的请求 这些请求 有很多比如说网址(url)都是相同的 端口也是相同的,路径可能也是相同的 这个时候就需要用到请求默认值,后续直接用就可以 不需要再去配置 后续 ...
- 三、Applied visual design(应用视觉设计)
一.文本属性整理 <style> h2 { /* 文字对齐属性 text-align */ /* center:居中,left,right:居左居右,justify:文字拉伸铺满一行 */ ...
- Java基础学习——循环取最接近某个值的方法
if(diff<mindiff) mindiff=diff;//循环取最小值 float value = (float) fenzi/fenmu;//整数相除结果会自动转换为整数.即使强制转换为 ...