软妹币!软妹币!软妹币!——重大4月月赛


Time Limit: 1000ms
Memory Limit: 65536KB
64-bit integer IO format: %lld Java class name: Main
Submit Status

大家都喜欢的软妹币面值是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

13

Sample Output

3
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 100010;

int dp[maxn];

int main()
{
    dp[1] = 1;
    dp[2] = 2;
    dp[3] = 2;
    dp[4] = 2;
    for(int i=5;i<=13;i++)
        dp[i] = 3;
    //cout<<"ok"<<endl;
    int x = 14;
    int xx ;
    while(x<50000){
        xx = x+x-1+x-1;
        for(int i=x;i<=xx;i++){
            dp[i] = dp[x-1]+1;
        }
        x = xx+1;
    }
    //cout<<"ok"<<endl;
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n>=x)
            printf("%d\n",dp[x-1]+1);
        else
            printf("%d\n",dp[n]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值