2021年蓝桥杯省赛最少砝码

评测用例规模与约定

对于所有评测用例,1≤N≤1000000000

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 512M

难度: 简单 标签: 省赛, 2021

题目分析

这题很容易让人联想到是不是dp,但是看到N的范围就知道这题另有解法感觉很像思维题,然后我们开始找规律,直接从N开始思考似乎有些困难,这里我们试着转换思路,从砝码数量找规律,寻找每个数量的砝码可以表示的N,这样,只要确定N在哪两个相邻砝码数量可以表示最大的范围之间,就可以找到对应的值,比如,1个砝码可以表示最大的N为1,很容易猜想到两个砝码最多表示的N为4,砝码分别为1,3,但是找3个砝码表示的最大就增大了一点难度,但是经过搜寻猜想,还是找到了N=13,砝码为1,3,9,这里就可以确定的是当N=1时输出1,当1<N<=4时输出2,当4<N<=13时输出3,那么这些数据之间有什么联系吗?我们可以发现每个砝码数量可以表示的最大的N都是在前一个砝码数量的砝码的基础上加上一个砝码,这样就增加了表示范围,并且砝码可以表示的N都是最大的N,现在在找到大概思路开始推理。

在这里不妨设砝码数为n,n个砝码表示最大的N为Xn

当n=1时

X1=1

当n=2时

添加一个A

假设我们不知道A为多少

则n=2可以表示的范围为[1,1]&&[A-1,A+1]

因为要连续,令A-1=2(保证表示范围最大化,所以不令A-1=1)

得A=3

所以n=2可以表示的范围为[1,4]

X2=4

当n=3时

同理n=3可以表示的范围为[1,4]&&[A-4,A+4]

得A=9,范围为[1,13]

X3=13

当n=k时

则n=k可以表示的范围为[1,Xk]&&[A-Xk,A+Xk]

得A=2Xk+1

所以Xk+1=3Xk+1

用数学方法得到Xn的通项公式为Xn=(3n-1)/2

由此我们就可以开始写代码了

这里要注意变量的范围,可能会超过int

用long long

代码

#include<stdio.h>
long long pow(int i)
{
    long long a=1;
    for(int j=1;j<=i;j++)a*=3;
    return (a-1)/2;
}
int main()
{
    int N;
    scanf("%d",&N);
    for(int i=1;;i++)
    	if(pow(i)>=N)
        {
            printf("%d",i);
            break;
        }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值