牛客寒假算法基础集训营2:处女座的砝码(初遇三进制)

牛客寒假算法基础集训营2:处女座的砝码(初遇三进制)

这是刷到牛客寒假集训营2里面的C题-处女座的砝码才知道的

首先,了解一下知乎上一位大佬的想法
地址:https://www.zhihu.com/question/30164499
还有一个博客是写关于这个题目的:
https://blog.csdn.net/snayf/article/details/86632631

链接:https://ac.nowcoder.com/acm/contest/327/C
来源:牛客网

处女座热爱做物理实验,为了实验,处女座必须要精确的知道物品的质量。处女座准备自己设计一套砝码,每一个砝码都是正整数,这套砝码必须能够精确测量出n以内所有正整数的质量,处女座想要知道至少需要多少个砝码。你可以在天平的任意一边放置砝码。
输入描述:
一行,一个正整数n
1<=n<=101000
输出描述:
一个整数,表示最少的砝码数。
示例1
输入
20

输出
4

说明
你可以选择1,2,6,11
1=1
2=2
3=1+2
4=6-2
5=6-1
6=6
7=6+1
8=6+2
9=6+2+1
10=11-1
11=11
12=11+1
13=11+2
14=11+2+1
15=11+6-2
16=11+6-1
17=11+6
18=11+6+1
19=11+6+2
20=11+6+2+1

**

个人思路:

**
这个题是后面补的,然后后面思考了很久后 个人觉得这个说明的例子有点误导 或者说是一个小坑把,首先,这是个砝码放在天平问题,有三种选择,要么放物体对面,和物体放在一起,或者不放。这样就联想到了三进制(但是对于小白来说这很难想到)所以必须学习三进制 (先看那个知乎链接里面的解答)那么任意一个数用三进制表示,比如17=(1)*9+(2)*3+(2)*1=(1)*27+(1-2)*9+(2-2)*3+(2-2)*1-1
从这里就很清楚了:27g放在物体对面 9g和1g放在物体那边 还有一个1g和3g就不放 最后化简后有1,-1,,0这三个值,这就是三进制强大之处,正好对应于三种情况 1代表放物体对面 -1代表和物体放在一起 0代表不放 然后就可以称17g的物体

等比数列:1+3+32+…+3k=(3^(k+1)-1)/2
(至于求法这里就不多说了)
然后我发现只要在(3(k+1)-1)/2内的数都可以通过1到3k之内数利用加减法 放砝码 要么放左边要么放右边要么不放
例如 1 3 9 27 四个数相加为40 那么40以内的都可以通过上述所说三进制来放砝码
计算机从0开始 这里的一个求和公式为sum=0 sum=sum*3+1 用num来计数 如下:
0 1
1 4
2 13
3 40
4 121
**

源代码:(注意高精度)

**

#include<bits/stdc++.h>
#include<iostream>
using namespace std;

int main(void)
{
    long double n,sum=0.0;
    scanf("%Lf",&n);
    int num=0;

    while(sum<n)
    {
        sum=3*sum+1;
        num++;
    }
    printf("%d\n",num);
    return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42429718/article/details/86760895