链接地址: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
10
3
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 人民币的构造的更多相关文章

  1. CDOJ 1264 人民币的构造 区间问题+数论

    人民币的构造 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Status ...

  2. UESTC--1264--人民币的构造(数学规律)

    人民币的构造 Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu Submit Status D ...

  3. CDOJ 第七届ACM趣味程序设计竞赛第三场(正式赛) 题解

    宝贵资源 题目连接: http://acm.uestc.edu.cn/#/problem/show/1265 题意 平面上给n个点(n<=1000),要求找一个面积最小的正方形,将所有的点都囊括 ...

  4. 学习笔记:Maven构造版本号的方法解决浏览器缓存问题

    需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...

  5. 一步步构造自己的vue2.0+webpack环境

    前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...

  6. Bootstrap人民币玩家攻略

    用bootstrap及其它基于它的框架,做了多次网站大改版~对bootstrap的特点有了越来越深的了解~从一开始接触时觉得超级鸡肋,到后来觉得方便,再到后来觉得还是能不用就别用了~为什么这么说?我们 ...

  7. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

    构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...

  8. Eos开发——构造查询条件

    1.ajax 方式 var data = { orgid :orgid,year:year ,month: month,type:type,sortField:'sellEmpname' ,sortO ...

  9. 返回人民币大写方式(num2rmb)

    CREATE OR REPLACE FUNCTION num2rmb(Pi_MONEY NVARCHAR2) RETURN NVARCHAR2 IS -- PURPOSE :返回人民币大写方式 v_N ...

  10. 【C++】类和对象(构造与析构)

    类 类是一种抽象和封装机制,描述一组具有相同属性和行为的对象,是代码复用的基本单位. 类成员的访问权限 面向对象关键特性之一就是隐藏数据,采用机制就是设置类成员的访问控制权限.类成员有3种访问权限: ...

随机推荐

  1. 几行python代码完美操控手机

    最近一直成谜于python代码带来的便利,今天打算学习下用python代码来控制操作手机,首先需要利用adb,通过安卓调试桥来达到目的,其实也可以用appium来实现,不过appium多数用在自动化测 ...

  2. Two Sum:给出一个整数数组,返回两个数的下标值,令其和等于一个指定的目标值 #Leetcode

    // Given nums = [2, 7, 11, 15], target = 9, // Because nums[0] + nums[1] = 2 + 7 = 9, // return [0, ...

  3. Linux用户管理2

    passwd给用户修改密码 用户自己给自己设置密码直接passwd root用户给普通用户设置密码passwd 用户名 --stdin从标准输入获取信息 echo "1" | pa ...

  4. 用python写xml文件

    def writeInfoToXml(filename, config_id, obj_name): from xml.dom.minidom import Document ''' eg: < ...

  5. K8SPod进阶资源限制以及探针

    一.Pod 进阶 1.资源限制 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量. 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源. 当为 Pod 中的容器指定了 reque ...

  6. scroll-view 横向滚动无效

    scroll-view的内层view元素需要: display: inline-block scroll-view的外层元素需要: white-space: nowrap 使得内部组件不换行.

  7. How to Show/Hide a Button Using the Business Process Flow Stage

    How to Show/Hide a Button Using the Business Process Flow Stage In today's blog, we'll discuss how t ...

  8. C#中Socket连接请求的超时设置

    C#中Socket连接请求的超时设置 <转载> C#中, 对于Socket的请求,无论是同步还是异步,都没有提供超时机制,SendTimeout,ReceiveTimeout均无用.. 对 ...

  9. CSS3之动画三大特性

    一 过渡模块 1 基本使用 1,过渡三要素1.1必须要有属性发生变化1.2必须告诉系统哪个属性需要执行过渡效果1.3必须告诉系统过渡效果持续时长 2.注意点当多个属性需要同时执行过渡效果时用逗号隔开即 ...

  10. 【Golang】Demo

    并发控制 package main // demo 参考地址https://studygolang.com/articles/25950 import ( "github.com/siddo ...