UESTC 1264 人民币的构造 数论

人民币的构造

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit  Status

我们都知道人民币的面值是 12510 ,为什么是这个数值呢,我们分析了下发现,从 110 的每个数字都可以由每种面值选出至多一张通过加法

和减法(找钱)来构成,(比如: 1+2=351=45+1=65+2=71+2+5=8101=9

但是实际上,我们只需要 127 三种面值就可以组成 110 的每一个数字了

1+2=3712=472=571=67+1=87+2=97+1+2=10

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

Input

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

Output

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

Sample input and output

Sample Input Sample Output
10
3

Source

第七届ACM趣味程序设计竞赛第三场(正式赛)C

My Solution

tem+sum是当前的最大可以构出的值。
否则tem=sum;tem=2*(tem+sum)+1;新的最大值是tem+sum
1,3,9开始找规律1只能1,1、3可以构出1、2、3、4,9可以构到13.这之前试过了给出的1、2、7好坑,又试1、3、8终于明白要这三个数的和尽可能的
大才行。本来以为是从第4项开始才有这个规律。错了两次才想到1、3、9直接从第一项就开始满足这个规律了。sumofall*2+1

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int n,sum=13,cot=3,tem=0;
    scanf("%d",&n);
    while(tem+sum<n){
        sum+=tem;
        tem=sum;//cout<<tem<<endl;
        sum=2*tem+1;//cout<<sum<<endl;
        cot++;
    }
    if(n==1) printf("1");
    else if(n<=4) printf("2");
    else if(n<=13) printf("3");
    else printf("%d",cot);
    return 0;
}





你可能感兴趣的:(数论,ACM,OJ,uestc,找规律,思维题)