中石油训练赛 - 招待(思维)

题目链接:点击查看

题目大意:给出一个天平,砝码由3的幂次组成,再给出物品重量,求如何摆放砝码能使得天平平衡

题目分析:既然给出的砝码是3的幂次组成,那么我们就将给出的物品重量转换为三进制即可,那么表示其每一位只有可能是0,1,2三个数字,我们假设物品摆在A盘,那么:

  1. 当前位数字为0,就说明该幂次没有贡献,所以不做处理
  2. 当前位数字为1,说明我们需要一个该幂次的重量放在B盘才能平衡
  3. 当前位数字为2,说明需要在A盘加上一个当前幂次的重量,同时在B盘上加上一个下一级幂次的重量(可以理解为进位)
  4. 当前位数字为3(进位后),说明该幂次没有贡献,不做处理,不过需要进位

模拟一下上述过程即可,时间复杂度为logn,log以3为底

上代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
   
typedef long long LL;
  
const int inf=0x3f3f3f3f;
  
const int N=1e4+100;
 
vectora,b;
 
LL p[38];
 
int main()
{
    p[0]=1;
    for(int i=1;i<38;i++)//预处理3的幂次,记得处理到1e16,因为最后一位可能需要涉及到进位
        p[i]=p[i-1]*3;
    LL n;
    scanf("%lld",&n);
    b.push_back(n);
    int f=0;//是否需要进位
    int cnt=0;//位次
    while(n)
    {
        int temp=n%3+f;
        if(temp==0)
        {
            f=0;
        }
        else if(temp==1)
        {
            a.push_back(p[cnt]);
            f=0;
        }
        else if(temp==2)
        {
            b.push_back(p[cnt]);
            f=1;
        }
        else if(temp==3)
        {
        	f=1;
	}
        n/=3;
        cnt++;
    }
    if(f)
    	a.push_back(p[cnt]);
    printf("%lld",a[0]);
    for(int i=1;i

 

你可能感兴趣的:(思维)