zoukankan      html  css  js  c++  java
  • 数论

    Funny scales 

    Problem's Link

     ----------------------------------------------------------------------------

    Mean: 

    给定两个数n和x,有一个天平,初始时左盘为x,你需要从以下集合中选一些数字来放到两个盘中,使得两个盘相等(note:每个数字只能取一次)。

    analyse:

    即:

     将X化为3进制:

    但是题目说每个3^i必须为1,所以我们需要将X表示成的等式的每一项的系数变为1,这就是本题的关键。

    方法:

    • 将X化为3进制的过程中,每一项的集合为{0,1,2} ,当遇到2时,将2表示成3-1的形式,即:向前进移位,本位置位-1。

    如此一来便很好的处理了系数重复的问题,而且最后统计答案时,根据系数的符号来划分集合即可。

    Time complexity: O(N)

     

    view code

    #include <cstdio>
    const int MAXL = 100;

    int N, X;
    int A[MAXL], lenA;
    int B[MAXL], lenB;
    int dig[MAXL];

    int main()
    {

       scanf( "%d %d", &N, &X );

       for ( int i = 0; X != 0; i++ )
       {
           dig[i] += X % 3;
           if ( dig[i] > 1 )
           {
               dig[i + 1]++;
               dig[i] = dig[i] - 3;
           }
           X /= 3;
       }

       for ( int i = MAXL - 1; i >= 0; i-- )
       if ( dig[i] != 0 )
           if ( dig[i] == -1 )
               A[lenA++] = i + 1;
           else if ( dig[i] == +1 )
               B[lenB++] = i + 1;

       if ( A[0] > N || B[0] > N )
           printf( "-1 " );
       else
       {
           for ( int i = lenA - 1; i >= 0; i-- )
           printf( i ? "%d " : "%d", A[i] );
           printf( " " );
           for ( int i = lenB - 1; i >= 0; i-- )
           printf( i ? "%d " : "%d", B[i] );
           printf( " " );
       }
       return 0;
    }
  • 相关阅读:
    Pycharm中的加载多个项目
    Python中的条件选择和循环语句
    Python中的模块
    python在不同层级目录import模块的方法
    数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案
    数据结构和算法关系
    二叉树及二叉树的遍历
    栈及其应用
    基础知识- 算法复杂度
    Java 特定规则排序-LeetCode 179 Largest Number
  • 原文地址:https://www.cnblogs.com/crazyacking/p/5431736.html
Copyright © 2011-2022 走看看