zoukankan      html  css  js  c++  java
  • 两个数之间的最短路径问题

    原址:http://blog.csdn.net/gogdizzy/article/details/6563626

    假设由A到B需要k步,分别是A1,A2,……Ak,每一步都是(5,-5,7,-7,12,-12)中一个。因为最终结果就是
    A1+A2+……+Ak,所以这k步是可以调换顺序的(加法交换律)。

    1> 如果这k步里,同时存在5,-5,那么可以约去。同理,(7,-7),(12,-12)也是。即最多存在8种选择,选定了一个数,那么它的相反数就不能出现。

    2> 7+5=12,(-7)+(-5)=(-12),12+(-7)=5,12+(-5)=7,(-12)+7=(-5),(-12)+5=(-7),

    即(7,5)(-7,-5)(12,-7)(12,-5)(-12,7)(-12,5)任何一对都不能同时出现,这样,又进一步缩小了范围。
    可能性只有
    5 -7的组合
    -5 7的组合
    5 12的组合
    7 12的组合
    -5 -12的组合
    -7 -12的组合

    3> 如果有7个5,可以用5个7替代,所以知道5的个数不超过7,同理,有
    -5的个数不超过7
    7的个数不超过12
    -7的个数不超过12

    有了这么多限制条件,只需要试一下即可。

     

     

     

    1. /** 
    2. * 用5,7,12加减运算,最少步骤到大n 
    3. * gogdizzy@gmail.com 
    4. */  
    5. #include <stdio.h>  
    6. #define abs(x) /  
    7.     ( (x^(x>>31))-(x>>31) )  
    8. int min_step( int N )  
    9. {  
    10.     int diff;  
    11.     int n5, n7, n12;  
    12.     int r5, r7, r12;  
    13.     unsigned tmp, total = unsigned (-1); // assign a very big num  
    14.       
    15.     for( n5 = -6; n5 < 7; ++n5 )  
    16.     {  
    17.         diff = N - 5 * n5;  
    18.         n7 = diff / 7;  
    19.         n12 = diff / 12;  
    20.         if( 12 * n12 + 5 * n5 == N )  
    21.         {  
    22.             tmp = abs( n5 ) + abs( n12 );  
    23.             if( total > tmp ) r5 = n5, r7 = 0, r12 = n12, total = tmp;  
    24.         }  
    25.         else if( 7 * n7 + 5 * n5 == N )  
    26.         {  
    27.             if( n7 > -12 && n7 < 12 )  
    28.             {  
    29.                 tmp = abs( n5 ) + abs( n7 );  
    30.                 if( total > tmp ) r5 = n5, r7 = n7, r12 = 0, total = tmp;  
    31.             }  
    32.         }  
    33.     }  
    34.     for( n7 = -11; n7 < 12; ++n7 )  
    35.     {  
    36.         n12 = ( N - 7 * n7 ) / 12;  
    37.         if( 7 * n7 + 12 * n12 == N )  
    38.         {  
    39.             tmp = abs( n7 ) + abs( n12 );  
    40.             if( total > tmp ) r5 = 0, r7 = n7, r12 = n12, total = tmp;  
    41.         }  
    42.     }  
    43.     printf( "%d = (%d) * 5 + (%d) * 7 + (%d) * 12/ntotal:%d/n", N, r5, r7, r12, total );  
    44.     return total;  
    45. }  
    46. int main()  
    47. {  
    48.     int n;  
    49.     scanf( "%d", &n );  
    50.     min_step( n );  
    51.     return 0;  
    52. }  
     

  • 相关阅读:
    CF528D Fuzzy Search
    P3489 付公主的背包
    有标号的DAG计数
    P4609 [FJOI2016]建筑师
    mds/journal.cc: 2929: FAILED assert解决
    Ceph根据Crush位置读取数据
    关于backfill参数建议
    rados put striper功能的调试
    Cephfs的文件存到哪里了
    为什么删除的Ceph对象还能get
  • 原文地址:https://www.cnblogs.com/catkins/p/5270760.html
Copyright © 2011-2022 走看看