zoukankan      html  css  js  c++  java
  • poj 1702 Eva's Balance(平衡三进制)

    题目大意:给你一个天平,和一些砝码,只是这些砝码有点特殊,它的重量是1,3,9,27,……3^n。让你把一些砝码和一个给定的重量的物体放在左边,另一些砝码放在右边,使天平平衡(每个砝码最多用一个)

    思路(平衡三进制):比如我们假设这个物体的重量是20,那么我们可以这样做。首先我们把20(十进制)转化为三进制(202),然后我们按照一定的规则,把这些数转化成0,1,-1表示。从低位到高位,我们这样来转化。当我们遇到一个2的时候,那么下一位加1,同时2变成-1。当我们遇到3的时候,那么下一位加1,同时3变成0,。然而当我们遇到1或0的时候我们不变也不进位。所以202就变成了1(-1)1(-1),这样20=(-1)*3^0+1*3^1+(-1)*3^2+1*3^3;这是一个很好的等式,所以我们把-1的项移到左边,剩下的在右边,就变成了20+1*3^0+1*3^2=1*3^1+1*3^3;这样放在天平的两端不就平衡了吗?20+1+9=3+27。

    代码:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    int a[100],i,n,T;
    
    int qpow(int a,int b)
    {
        int s=1;
        while(b>0)
        {
            if(b%2==1)
            {
                s=s*a;
            }
            a=a*a;
            b>>=1;
        }
        return s;
    }
    
    int main()
    {
        cin>>T;
        while(T--)
        {
            cin>>n;
            int ni=n;
            memset(a,0,sizeof(a));
            for(i=0;ni;i++)
            {
                a[i]=ni%3;
                ni=(ni-a[i])/3;
            }
            for(int j=0;j<i;j++)
            {
                if(a[j]==3)//我们遇到3的时候,那么下一位加1,同时3变成0
                {
                    a[j]==0;
                    a[j+1]++;
                }
                if(a[j]==2)//当我们遇到一个2的时候,那么下一位加1,同时2变成-1
                {
                    a[j+1]++;
                    a[j]=-1;
                }
            }
            int flag1=0,flag2=0;
            for(int j=0;j<=i;j++)
            {
                if(a[j]==-1)
                {
                    if(flag1) printf(",");
                    flag1=1;
                    cout<<qpow(3,j);
                }
            }
            if(flag1==0) cout<<"empty";
            cout<<" ";
            for(int j=0;j<=i;j++)
            {
                if(a[j]==1)
                {
                    if(flag2) printf(",");
                    flag2=1;
                    cout<<qpow(3,j);
                }
            }
            cout<<endl;
        }
    
        return 0;
    }

     二进制和三进制的妙用:https://blog.csdn.net/qq_30339595/article/details/79410369

  • 相关阅读:
    zz 使用svn——项目的目录布局
    eclipse中字体太小
    SVN 项目的目录结构
    tuscany requires 学习
    搜索子集生成
    HZNUACM寒假集训Day12小结 数论入门
    HZNUACM寒假集训Day10小结 树树形DP
    模板 快速幂|取余
    HZNUACM寒假集训Day7小结 背包DP
    HZNUACM寒假集训Day6小结 线性DP
  • 原文地址:https://www.cnblogs.com/Fy1999/p/8995293.html
Copyright © 2011-2022 走看看