• URAL1495. One-two, One-two 2(dp)


    1495

    牵扯一点数位 保存数的时候我是按2进制保存的 把1当作0算 把2当作1算 滚动数组

    dp[i][j][(g*10+j)%n] = min(dp[i][j][(g*10+j)%n],dp[i-1][1][g]*2+j-1,dp[i-1][2][g]*2+j-1) j取1,2   *2+j-1是因为我按二进制算的

    时限给出的2S就是给我这种毫无优化又笨又戳的代码的 跑了1.39s

    0xfffffff的范围 是2Y多 还是少用好了  太容易超了 

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 using namespace std;
     8 #define N 1000010
     9 #define INF 1e9
    10 #define LL long long
    11 LL dp[2][3][N];
    12 int o[33];
    13 int main()
    14 {
    15     int i,j,n,g,y;
    16     LL x = INF;
    17     cin>>n;
    18     if(n==1||n==2)
    19     {
    20         cout<<n<<endl;
    21         return 0;
    22     }
    23     int flag = 0;
    24     for(i = 1 ; i <= 2 ; i++)
    25         for(j = 0 ; j < n ; j++)
    26         dp[0][i][j] = dp[1][i][j] = INF;
    27     for(i = 1; i <= 2 ; i++)
    28     dp[1][i][i%n] = i-1;
    29     for(i = 2; i <= 30 ; i++)
    30     {
    31         for(j = 1; j <= 2 ; j++)
    32         {
    33             for(g = 0 ; g < n ; g++)
    34             {
    35                 if(dp[(i-1)%2][1][g]!=INF)
    36                 dp[i%2][j][(g*10+j)%n] = min(dp[i%2][j][(g*10+j)%n],dp[(i-1)%2][1][g]*2+j-1);
    37                 if(dp[(i-1)%2][2][g]!=INF)
    38                 dp[i%2][j][(g*10+j)%n] = min(dp[i%2][j][(g*10+j)%n],dp[(i-1)%2][2][g]*2+j-1);
    39                 if((g*10+j)%n==0&&dp[i%2][j][0]!=INF)
    40                 {
    41                     flag = 1;
    42                     if(x>dp[i%2][j][0])
    43                     {
    44                         x = min(x,dp[i%2][j][0]);
    45                         y = i;
    46                     }
    47                 }
    48             }
    49         }
    50         if(flag) break;
    51     }
    52     if(!flag)
    53     puts("Impossible");
    54     else
    55     {
    56         g = 0;
    57         while(x)
    58         {
    59             o[++g] = x%2+1;
    60             x/=2;
    61         }
    62         for(i = 1 ; i <= y-g ; i++)
    63         cout<<"1";
    64         for(i = g;i >= 1; i--)
    65         cout<<o[i];
    66     }
    67     return 0;
    68 }
    View Code
  • 相关阅读:
    Delphi中的构造函数的override的问题
    一个很初级的错误 Destructor忘记override导致内存泄露
    WPF 详解模板
    再说WCF Data Contract KnownTypeAttribute
    ADO.NET Data Service
    Using ADO.NET Data Service
    资源:Localization – 本地化
    Dynamic Resource – 动态资源
    应用开发之Linq和EF
    语法之多线程
  • 原文地址:https://www.cnblogs.com/shangyu/p/3543307.html
Copyright © 2020-2023  润新知